证书的申请
这里以阿里云为例 阿里云盾 根据系统下载合适的就可以了
使用
·
tomcat中的使用
首先进入tomcat根目录,然后创建文件夹cert 将刚才下载的两个文件导入进去 接着我们移动到配置文件 tomcat安装目录下执行
nano ./conf/server.xml
方式一: 找到配置端口号的<Connector/> 标签,将默认配置注销掉 修改配置为
<Connector port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="Tomcat安装目录/cert/xxxxxx.pfx"
keystoreType="PKCS12"
keystorePass="证书密码"
clientAuth="false"
SSLProtocol="TLSv1.1+TLSv1.2+TLSv1.3"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>
方式二:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="Tomcat安装目录/cert/domain name.pfx" keystorePass="证书密码"
clientAuth="false" sslProtocol="TLS"/>
可选:配置web.xml文件,开启HTTP强制跳转HTTPS。 在文件后添加以下内容:
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
Springboot内置tomcat的使用
首先将两个证书文件移动到resource 中(在其他地方也行,只是这里方便而已) 然后我们编辑配置文件
server.port=17241
server.ssl.key-store=classpath:xxxxxxx.pfx
server.ssl.key-store-password=xxxxxxx
server.ssl.keyStoreType=PKCS12
server.ssl.enabled=true
然后我们添加配置类解决无法同时开启http和https的问题
@Configuration
public class SSLConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createHTTPConnector());
return tomcat;
}
private Connector createHTTPConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(8080);
connector.setRedirectPort(3036);
return connector;
}
}
添加配置类http自动跳转https
@SpringBootApplication
public class SpringbootmyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootmyApplication.class, args);
}
@Bean
public EmbeddedServletContainerFactory servletContainer(){
TomcatEmbeddedServletContainerFactory tomcat=new TomcatEmbeddedServletContainerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("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.setPort(80);
connector.setSecure(false);
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;
}
}
|