应用与ngxin支持HTTPS

生成 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 加密算法对生成的私钥进行加密。这会要求在生成过程中设置一个密码来保护私钥。

执行后的提示:

  1. 输入私钥密码:在生成过程中,会提示你设置一个密码(Enter PEM pass phrase:)。这是用来加密和保护私钥的密码。你需要记住这个密码,因为以后会用到它。
  2. 再次输入密码:系统会要求你再次输入密码来确认。

在输入密码时,会看到一些字符隐藏,属于正常情况。

生成 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 年)。

执行后的提示:

  1. 输入私钥的密码:你会被要求输入私钥的密码(也就是之前在生成私钥时设置的密码),用于解密私钥。

  2. 填写证书的字段信息:系统会提示你输入证书的各种信息,这些信息将嵌入到生成的证书中。你需要根据提示依次输入以下信息:

    • 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) 字段的几点说明:
  1. 单一主机名/域名:通常,CN 字段应包含一个主机名或域名,这个主机名或域名应当是证书所针对的服务器或应用的标识。例如,www.example.commyserver.local
  2. 多个应用部署
    • 如果你的服务器上有多个应用运行并且它们都需要使用相同的证书,那么你不能在 CN 字段写多个域名。你应该使用一个主机名(比如 myserver.local 或一个公共的 example.com 域名),然后使用 Subject Alternative Names (SAN) 扩展字段来列出其他域名。
    • SAN 允许你为同一个证书添加多个域名,这样你就可以让多个应用都信任这个证书。
使用 Subject Alternative Name (SAN) 解决多个域名/主机的需求

你可以在生成证书时,除了设置 CN 外,还可以通过 SAN 扩展来添加额外的域名或 IP 地址。这样,多个应用可以共享同一个证书,但各自可以使用不同的域名。

如何使用 SAN:
  1. 创建配置文件:首先,你需要创建一个 OpenSSL 配置文件,其中包含 SAN 扩展字段。可以在配置文件中指定多个 DNSIP

    创建一个配置文件 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
    
  2. 使用配置文件生成证书: 生成证书时,指定配置文件来包括 SAN 扩展:

    bash
    
    
    复制编辑
    openssl req -x509 -new -key ca.key -out ca.crt -days 3650 -extensions v3_ca -config openssl.cnf
    
  3. 证书验证: 生成的证书将包含多个域名(如 myserver.localexample.comapp1.example.comapp2.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 的过程中,你会被要求输入一些信息,这些信息将被写入证书中,具体包括:

  1. Country Name (2 letter code):国家名称,例如 CN(中国)、US(美国)。
  2. State or Province Name (full name):省或州的名称(例如 Beijing)。
  3. Locality Name (e.g., city):城市名称(例如 Beijing)。
  4. Organization Name (e.g., company):组织或公司名称(例如 MyCompany)。
  5. Organizational Unit Name (e.g., section):部门名称,通常可以为空。
  6. Common Name (e.g., server FQDN or YOUR name):证书的 Common Name (CN),通常为你服务器的域名(例如 example.commyserver.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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值