- 证书的申请
- 使用
- tomcat中的使用
- Springboot内置tomcat的使用
- Nginx中的使用
- demo
这里以阿里云为例
阿里云盾
根据系统下载合适的就可以了
·
tomcat中的使用
首先进入tomcat根目录,然后创建文件夹cert将刚才下载的两个文件导入进去
接着我们移动到配置文件
tomcat安装目录下执行
nano ./conf/server.xml
方式一:
找到配置端口号的
修改配置为
方式二:
可选:配置web.xml文件,开启HTTP强制跳转HTTPS。
在文件后添加以下内容:
CLIENT-CERT Client Cert Users-only Area SSL @Bean public EmbeddedServletContainerFactory servletContainer(){ TomcatEmbeddedServletContainerFactory tomcat=new TomcatEmbeddedServletContainerFactory(){ @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint=new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL");//confidential SecurityCollection collection=new SecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(httpConnector()); return tomcat; } @Bean public Connector httpConnector(){ Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false); connector.setRedirectPort(8443); return connector; } }
此处 是1.x的解决办法2.x版本中省去了postProcessContext方法的实现
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
//Connector监听的http的端口号
connector.setPort(80);
connector.setSecure(false);
//监听到http的端口号后转向到的https的端口号
connector.setRedirectPort(443);
return connector;
}
此处来源:https://blog.csdn.net/qq_41170102/article/details/105837477
然后此时项目就可以通过[https://域名] | [https://域名:端口] 访问了
Nginx中的使用依然是刚才的位置,这次我们下载nginx版的证书
接着我们把他移动到我们服务器专门用来放证书的位置(大家视情况而定),
这里由于我是使用的docker安装ngixn,所以我移动到了之前挂载到docker的一个目录在里面新建了以恶搞cert目录用以存放证书,把容器看作是另一个系统,不挂载过去是无法访问的;
容器里成功看到文件目录,挂载成功
然后回到我们挂载的目录。编辑配置文件。找到http片段(或者新建一个文件夹编辑server然后进行导入)
yourdomain.com:替换成证书绑定的域名。
如果您购买的是单域名证书,需要修改为单域名(例如www.aliyundoc.com);如果您购买的是通配符域名证书,则需要修改为通配符域名(例如*.aliyundoc.com)。
使用docker时千万注意证书路径的填写,需要填写的是容器内部的地址
#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
root html;
index index.html index.htm;
ssl_certificate cert/cert-file-name.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key cert/cert-file-name.key; #需要将cert-file-name.key替换成已上传的证书私钥文件的名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录。
index index.html index.htm;
}
}
配置好以后
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name cctv.cn www.cctv.cn;
root html;
index index.html index.htm;
#证书地址这里有个坑,记住他是以ngin根目录为基准的相对路径,由于这里我挂载了conf.d所以文件在conf.d的cert中,所以配置如下
ssl_certificate conf.d/cert/67_cctv.cn.pem;#这里是证书
ssl_certificate_key conf.d/cert/67_cctv.cn.key;#这里是证书
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
#注意ip地址,宿主机和容器相当于内网,所以内网ip和公网ip都可以,不能是回环地址
proxy_pass http://47.243.67.238:8080;
proxy_http_version 1.1;
#下面就是做转发前的端口ip记录配置了
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
server{
监听80端口所有cctv.cn域名来的请求转发到https;
listen 80;
server_name cctv.cn;
location / {
return 302 https://$server_name$request_uri;
}
}
server{
#这里是80端口的api服务
listen 80;
server_name api.xxx.cn;
location / {
proxy_pass http://47.23.167.238:10080;
}
}
demo
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name xxx.cn www.xxx.cn;
root html;
index index.html index.htm;
ssl_certificate conf.d/cert/667a07_xxx.cn.pem;
ssl_certificate_key conf.d/cert/66a507_xxx.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://47.22.167.238:19527;
#使用frps转发的时候不要设置下面这些,也不知道为啥。会404,先设置把。琢磨清楚了再回来改;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_cache_bypass $http_upgrade;
}
}
server{
listen 80;
server_name xxx.cn;
location / {
return 302 https://$server_name$request_uri;
}
}
#这里发现80就能正常转发,但是加上上面的哪些设置请求头frps就会报错,就是没有页面的那个错
server{
listen 80;
server_name api.xxx.cn;
location / {
proxy_pass http://47.22.167.238:19527;
}
}
排除法嘛:
使用树莓派代挂公网服务器VP;
域名挂vp服务器,映射关系:访问vp的已配置映射端口时,就会转发到映射的内网机上
web:树莓派19527-vp19527
内网:19527 √
http:域名:19527 X(因为没配置策略?)
http:api域名 √ (80端口可以正常检测域名并转发)
https:域名 X (443转发策略是没问题的,可是出现了frp找不到页面的报错[也算是证明了转发起效了])
公网ip:19527 √
推断问题出在域名的转发上面;
把原先可以访问的api域名改成443的配置,发现api也不能访问了,推断后面哪些设定请求头的操作造成了frps的异常,删除443端口根据域名转发下的设置请求头操作,成功访问
有没有大佬知道是为什么呢,,求教求教
脑子一团乱:
回忆:
一个请求究竟是https并不取决于这个服务本身的配置,服务本身不用管自己要不要ssl,
emmmmm…再想想…
取决于最终配置ssl的nginx怎么配置转发规则,,
也就是向访问者提供访问路径,并非服务决定,,而是nginx决定的,,,是这样吧。。。。。。
服务只是创建了一个接口,
用户也只是告诉nginx他想访问什么,
nginx再根据配置好的策略进行匹配,
通过访问的特征数据进行转发比如域名,URI



