参考:
https://blog.csdn.net/weixin_45355769/article/details/131727935
安装好openssl后,
创建 D:\certificate
CA文件夹下包含:
- index.txt OpenSSL在创建自签证书时会向该文件里写下索引
- database.txt OpenSSL会模拟数据库将一些敏感信息写在该文件里
- serial 创建该文件后,请编辑在第一行写下 01 (注意,没有后缀)
- newcerts 文件夹
注意: 这里提到的所有文件必须补齐,并且文件名不得更改 !
再注:在windows,没有openssl.conf默认文件夹的位置,所以需要自己配置环境变量。
1.3 生成自己的CA证书
首先,我们需要把自己先扮演成CA机构,根据非对称加密的概念,我们需要有一对密钥,对应一把公钥和一把私钥,私钥放在自己身边,公钥提供出去,这边需要注意的是不能把他看成是服务端,CA机构是在客户端和服务端两者之间的一个存在,这边理解了后,我们先来创建一把私钥,可以使用openssl来生成。
1.3.1 生成 rootca.key私钥文件
openssl genrsa -out rootca.key 4096
1.3.2 根据私钥文件生成req请求文件,req请求文件用来生成证书的时候使用
如果是自己使用,搭建着玩或者自己私人的网站,就使用openssl生成就好了。
1.3.3 生成X.509格式的CA根证书rootca.crt
openssl x509 -req -in rootca.csr -out rootca.crt -signkey rootca.key -days 36500
这个证书就是CA机构会预先在客户端中的受信任列表中埋下的根证书,其中包括了证书的所有者信息和公钥信息,有了这些信息,客户端就能通过这些信息来验证服务端返回的CA证书的合法性了。
mmc
1.4 CA机构给自己颁发证书:生成服务端证书
1.4.1 生成服务器私钥文件server1.key
openssl genrsa -des3 -out server1.key 4096
输入 PEM pass
1.4.2 创建请求文件,然后输入信息。
openssl req -new -key server1.key -out server1.csr
1.4.3 使用根证书签发证书
openssl x509 -req -in server1.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out server1.crt -days 36500
1.4.4 配置-extensions和-extfile扩展字段防止浏览器检查失败
ssl.conf
[req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.80
IP.2 = 127.0.0.1
IP.3 = 192.168.1.249
DNS.1 = localhost
#DNS.2 = localhost
配置片段是用于SSL证书配置中的一个部分,它通常用于定义subjectAltName
扩展项的值。这部分内容通常会包含在一个 OpenSSL 配置文件中,用于生成或签署证书请求(CSR)或直接生成自签名证书。
在这个例子中:
[req_ext]
部分指定了请求扩展(request extensions),这些是在证书请求中或最终证书里需要包含的额外属性。subjectAltName = @alt_names
指示使用名为alt_names
的替代名称集。@
符号是用来引用一个之前定义的命名段,在这个情况下就是下面定义的[alt_names]
。[alt_names]
部分列出了具体的替代名称条目,包括IP地址和DNS名称。这允许证书被用于多个不同的主机名或IP地址,提高了灵活性。
具体来说,你配置了以下替代名称:
- 三个IP地址:192.168.1.80、127.0.0.1、192.168.1.249
- 一个DNS名称:localhost
- 还有一个DNS.2被注释掉了,这意味着如果需要可以取消注释来包含另一个DNS名称。
此配置有助于确保生成的证书能够适用于列出的所有网络标识,无论是通过IP还是DNS访问。这对于那些需要在多个地址上验证服务身份的场景特别有用,比如配置HTTPS网站或安全的API服务等。
- 带上配置文件,执行签发命令
openssl x509 -req -in server1.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out server2.crt -days 36500 -extensions req_ext -extfile ssl.conf
创建完毕!
修改IP后
执行
openssl x509 -req -in server1.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out server2.crt -days 36500 -extensions req_ext -extfile ssl.conf
再执行下面的操作:
3. spring boot配置ssl证书实现https
2.1 配置证书
在java环境中用的证书形式有p12格式的,jks格式的,所以需要做转换,以p12为例
openssl pkcs12 -export -clcerts -in server1.crt -inkey server1.key -out server2.p12
首先用命令查询一下别名:
keytool -list -v -keystore server2.p12
2.2 添加到springboot项目中
把server2.p12复制到spring boot的 src/main/resources/ 目录下,和application.yaml平级
2.3 配置文件
可以访问了。
将所有HTTP请求重定向到HTTPS
package com.zbIntel.integration.config;
import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HttpsConfig {
@Value("${server.port}")
private int httpsPort;
@Value("${http.port}")
private int httpPort;
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@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);
}
};
// 添加HTTP连接器
tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
return tomcat;
}
// 初始化HTTP连接器
private Connector initiateHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(httpPort);
connector.setSecure(false);
connector.setRedirectPort(httpsPort);
return connector;
}
}