技术饭

本地开发环境nginx配置HTTPS,使用https证书

copylian    0 评论    7204 浏览    2020.12.09

1607482569(1).png

我们访问的所有网站几乎都是受HTTPS保护的。如果你的站点还没有,那你应该使用它。使用HTTPS保护服务器也意味着你不能从不是HTTPS服务器向此服务器发送请求。这给使用本地开发环境的开发人员带来了一个问题,因为它们都运行在开箱即用的http://localhost环境中。

在我参与的项目启动阶段,我们决定使用HTTPS来保护AWS弹性负载均衡入口,这是增强安全性的一部分。我遇到了这样的情况,本地开发环境对服务器的请求开始被拒绝。

在搜索谷歌之后,我发现了几篇类似这样的文章,其中详细说明了如何在localhost上实现HTTPS。即使在我虔诚地遵循这些指导之后,似乎没有一条是有效的。Chrome总是抛出一个NET::ERR_CERT_COMMON_NAME_INVALID错误给我。

1607482626(1).png


问题

我所找到的所有详细说明在当时都是正确的。但现在不行了。

经过大量的谷歌搜索,我发现本地证书被拒绝的原因是Chrome不支持证书中的commonName匹配,实际上从2017年1月起就要求使用subjectAltName

解决方案

使用OpenSSL生成所有证书。

步骤1:根SSL证书

第一步是创建根安全套接字层(Secure Sockets Layer -SSL)证书。然后,可以使用此根证书对任意数量的独立域名的证书进行签名。如果您不熟悉SSL生态系统DNSimple的这篇文章很好地介绍了根SSL证书。

生成一个RSA-2048密钥并将其保存到文件rootCA.key中。此文件将用作生成根SSL证书的密钥。每次使用此特定密钥生成证书时,都会提示您输入一个pass短语。

openssl genrsa -des3 -out rootCA.key 2048

你可以使用生成的密钥创建新的根SSL证书。将它保存到一个名为rootCA.pem的文件中。本证书有效期为1024天。你可以随意把它改成你想要的天数。还会提示您输入其他可选信息。

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem 

1607482825(1).png

步骤2:信任根SSL证书

在使用新创建的根SSL证书开始颁发域证书之前,还有一个步骤。你需要告诉你的Mac要信任你的根证书,所以由它发出的所有证书也都是可信的。

打开Mac上的密钥链访问,进入系统密钥链中的证书类别。使用文件>导入项目导入rootCA.pem。双击导入的证书,并在“When using this certificate:”的选项下拉框中选择“始终信任”。

如果到目前为止正确地遵循了操作指引,那么你的证书在Keychain Access中应该是这样的。

1607482882(1).png

window系统通过window+r组合键调出运行运行工具后,输入certlm.msc,之后导入rootCA.pem与server.crt,没有生成server.crt可以先走步骤3:域SSL证书

1607483058(1).png


1607482925(1).png

1607483631(1).png

步骤3:域SSL证书

现在可以使用根SSL证书专门为位于localhost的本地开发环境颁发证书。

创建一个新的OpenSSL配置文件server.csr.cnf,以便在创建证书时导入这些设置,而不是在命令行中输入它们。

[req]

default_bits = 2048

prompt = no

default_md = sha256

distinguished_name = dn


[dn]

C=US

ST=RandomState

L=RandomCity

O=RandomOrganization

OU=RandomOrganizationUnit

emailAddress=hello@example.com

CN = localhost


创建一个v3.ext文件以创建一个X509 v3证书。注意这里是如何指定subjectAltName的。

authorityKeyIdentifier=keyid,issuer

basicConstraints=CA:FALSE

keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment

subjectAltName = @alt_names


[alt_names]

#这里可以是多个域名,如DNS.1、DNS.2、DNS.3 ...... 这行是备注可以删掉

DNS.1 = localhost

DNS.2 = api.abc.com


使用server.csr.cnf中存储的配置设置为本地主机创建证书密钥。此密钥存储在server.key中。

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server.csr.cnf )>

window下直接执行:

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config cat server.csr.cnf 

如果报错则把cat去掉:

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf 

证书签名请求通过前面创建的根SSL证书发出,以便为localhost创建域证书。输出是一个名为server.crt的证书文件。

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

1607483207(1).png


使用新的SSL证书

现在可以使用HTTPS保护本地主机了。移动server.keyserver.crt文件到服务器上可访问的位置,并在启动服务器时包含它们。

1607483842(1).png

在一个用Node.js编写的Express应用程序可以这样做。确保只在本地开发环境使用,不要在生产中使用这个。

var path = require('path')

var fs = require('fs')

var express = require('express')

var https = require('https')


var certOptions = {

  key: fs.readFileSync(path.resolve('build/cert/server.key')),

  cert: fs.readFileSync(path.resolve('build/cert/server.crt'))

}


var app = express()


var server = https.createServer(certOptions, app).listen(443)

1607483253(1).png

希望本教程对你有用。如果你不习惯自己运行命令,我创建了一组方便的shell脚本,你可以快速运行这些脚本来生成证书。更多细节可以在GitHub repo上找到。

原文:How to get HTTPS working on your local development environment in 5 minutes

参考:https://juejin.cn/post/6844903863137337357

飓风呀
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
nginx HTTPS https证书 

文明上网理性发言!

  • 还没有评论,沙发等你来抢