生成 CA 私钥 (ca.key
)
openssl genpkey -algorithm RSA -out ca.key -aes256 # 生成 CA 私钥
解释:
openssl genpkey
:是生成私钥的命令。
-algorithm RSA
:指定使用 RSA 算法生成私钥。
-out ca.key
:指定生成的私钥文件的输出路径和文件名,这里是ca.key
。
-aes256
:指定使用 AES-256 加密算法对生成的私钥进行加密。这会要求在生成过程中设置一个密码来保护私钥。
执行后的提示:
- 输入私钥密码:在生成过程中,会提示你设置一个密码(
Enter PEM pass phrase:
)。这是用来加密和保护私钥的密码。你需要记住这个密码,因为以后会用到它。 - 再次输入密码:系统会要求你再次输入密码来确认。
在输入密码时,会看到一些字符隐藏,属于正常情况。
生成 CA 证书 (ca.crt
)
openssl req -x509 -new -key ca.key -out ca.crt -days 3650 # 生成 CA 证书
解释:
openssl req
:是生成证书请求(CSR)或自签名证书的命令。-x509
:指定生成自签名证书,而不是证书请求(CSR)。-new
:表示创建新的证书。-key ca.key
:指定用于生成证书的私钥文件,即你之前生成的ca.key
。-out ca.crt
:指定生成的证书文件的输出路径和文件名,这里是ca.crt
。-days 3650
:指定证书的有效期为 3650 天(即 10 年)。
执行后的提示:
-
输入私钥的密码:你会被要求输入私钥的密码(也就是之前在生成私钥时设置的密码),用于解密私钥。
-
填写证书的字段信息:系统会提示你输入证书的各种信息,这些信息将嵌入到生成的证书中。你需要根据提示依次输入以下信息:
-
Country Name (2 letter code):国家代码,通常是
CN
(中国)或US
(美国)等。 -
State or Province Name (full name):省或州的名称。
-
Locality Name (eg, city):城市名称。
-
Organization Name (eg, company):公司或组织名称。
-
Organizational Unit Name (eg, section):组织单元的名称,通常可以为空。
-
Common Name (e.g. server FQDN or YOUR name):常用名称,这里需要填入 证书的主机名(例如,
localhost
或你的域名)。对于生成的证书非常重要,通常它应该是你的主机名、服务器的 FQDN(完全合格的域名)或其他可以唯一标识你的服务器的名称。 -
Email Address:电子邮件地址,可以为空。
-
这里可能出现填写 如下参数,直接回车就行
-
关于 Common Name (CN)
字段的几点说明:
- 单一主机名/域名:通常,
CN
字段应包含一个主机名或域名,这个主机名或域名应当是证书所针对的服务器或应用的标识。例如,www.example.com
或myserver.local
。 - 多个应用部署:
- 如果你的服务器上有多个应用运行并且它们都需要使用相同的证书,那么你不能在
CN
字段写多个域名。你应该使用一个主机名(比如myserver.local
或一个公共的example.com
域名),然后使用 Subject Alternative Names (SAN) 扩展字段来列出其他域名。 - SAN 允许你为同一个证书添加多个域名,这样你就可以让多个应用都信任这个证书。
- 如果你的服务器上有多个应用运行并且它们都需要使用相同的证书,那么你不能在
使用 Subject Alternative Name (SAN) 解决多个域名/主机的需求
你可以在生成证书时,除了设置 CN
外,还可以通过 SAN 扩展来添加额外的域名或 IP 地址。这样,多个应用可以共享同一个证书,但各自可以使用不同的域名。
如何使用 SAN:
-
创建配置文件:首先,你需要创建一个 OpenSSL 配置文件,其中包含 SAN 扩展字段。可以在配置文件中指定多个
DNS
或IP
。创建一个配置文件
openssl.cnf
,并在其中添加如下内容:bash 复制编辑 [ req ] distinguished_name = req_distinguished_name x509_extensions = v3_ca [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) organizationName = Organization Name (eg, company) organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (e.g. server FQDN or YOUR name) emailAddress = Email Address [ v3_ca ] subjectAltName = @alt_names [ alt_names ] DNS.1 = myserver.local DNS.2 = example.com DNS.3 = app1.example.com DNS.4 = app2.example.com
-
使用配置文件生成证书: 生成证书时,指定配置文件来包括 SAN 扩展:
bash 复制编辑 openssl req -x509 -new -key ca.key -out ca.crt -days 3650 -extensions v3_ca -config openssl.cnf
-
证书验证: 生成的证书将包含多个域名(如
myserver.local
、example.com
、app1.example.com
、app2.example.com
等)。当这些域名中的任意一个被用于访问服务器时,证书都会被验证通过。
生成服务器私钥 (server.key
)
openssl genpkey -algorithm RSA -out server.key -aes256
解释
openssl genpkey
:这是 OpenSSL 用于生成私钥的命令。
-algorithm RSA
:指定使用 RSA 算法来生成密钥。
-out server.key
:指定生成的私钥文件名为server.key
。
-aes256
:使用 AES-256 算法加密私钥文件,以增强安全性。
输入提示:
- 密码:这时你会被要求输入一个密码来加密你的私钥文件。这个密码将用于保护
server.key
文件,只有提供正确的密码才能解锁该私钥。
生成证书请求文件 (server.csr
)
openssl req -new -key server.key -out server.csr
解释
openssl req -new
:用于生成一个新的证书请求(CSR)。
-key server.key
:指定使用server.key
这个私钥来生成证书请求。
-out server.csr
:指定生成的证书请求文件名为server.csr
。
输入提示
在生成 CSR 的过程中,你会被要求输入一些信息,这些信息将被写入证书中,具体包括:
- Country Name (2 letter code):国家名称,例如
CN
(中国)、US
(美国)。 - State or Province Name (full name):省或州的名称(例如
Beijing
)。 - Locality Name (e.g., city):城市名称(例如
Beijing
)。 - Organization Name (e.g., company):组织或公司名称(例如
MyCompany
)。 - Organizational Unit Name (e.g., section):部门名称,通常可以为空。
- Common Name (e.g., server FQDN or YOUR name):证书的 Common Name (CN),通常为你服务器的域名(例如
example.com
或myserver.local
)。同上
使用 CA 证书签发服务器证书 (server.crt
)
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650
解释
openssl x509 -req
:这是用来签发证书的命令,-req
表示用证书请求文件签发证书。
-in server.csr
:指定输入的证书请求文件(CSR),即之前生成的server.csr
文件。
-CA ca.crt
:指定用于签发证书的 CA 证书,即你之前生成的ca.crt
。
-CAkey ca.key
:指定 CA 证书的私钥,即你生成 CA 时使用的私钥ca.key
。
-CAcreateserial
:表示如果 CA 没有创建过序列号文件,OpenSSL 会自动创建一个。
-out server.crt
:指定输出的服务器证书文件名为server.crt
。
-days 3650
:指定证书的有效期为 3650 天,即大约 10 年。
输入提示:
- CA 私钥密码:你需要输入 CA 私钥的密码,以便签发证书。
Nginx配置项
server {
listen 9111 ssl;
server_name localhost;
ssl_certificate /data01/temp/testhttp/server.crt; # 证书文件路径
ssl_certificate_key /data01/temp/testhttp/server.key;
location / {
proxy_pass proxy_pass https://10.58.16.53:9112/test; #注意,域名配置的是什么要填什么
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /data01/temp/testhttp/ca.crt; # CA 证书路径,用于验证后端
#proxy_ssl_verify_depth 2;
}
}
转为SpringBoot需要的p12文件
openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name server
解释
openssl pkcs12 -export
:这是 OpenSSL 用于创建 PKCS#12 格式证书(通常用于 Java 和某些应用程序,如 Spring Boot)的命令。PKCS#12 是一种证书和私钥的打包格式,通常以.p12
或.pfx
扩展名保存。
-in server.crt
:这是你之前生成的服务器证书server.crt
,它将被打包到.p12
文件中。
-inkey server.key
:这是与你的证书匹配的私钥文件server.key
,它也会被打包到.p12
文件中。
-out server.p12
:指定输出的.p12
文件名,这里是server.p12
,它将包含你的证书和私钥。
-name server
:指定在.p12
文件中的证书别名。你可以根据需要选择一个名字,这里用了server
作为别名。
这里会提示输入 server.key的密码与 导出p12文件使用的密码。
导入p12使用的密码,需要在SpringBoot中使用
SpringBoot配置文件样例
server.port=9112
server.ssl.key-store=/data01/temp/testhttp/server.p12
server.ssl.key-store-password=123456
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=server
应用支持HTTPS同时继续支持HTTP
按照如上配置,应用其实已经支持了HTTPS、但不能通过HTTP访问,如果想兼容支持HTTP可增加如下内容
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(8080); // HTTP开放的端口
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}