在本地主机上实现SSL的正确方法


11

谁能建议一种现代的方式来生成将在localhost上实现的自签名证书,而Chrome和Mozilla会接受这种方式?

我尝试了openssl一代,但是Mozilla抱怨发行者不受信任。

Centos 7,Nginx


使用“ 让我们加密”
托马斯

2
它是本地域,让我们加密仅适用于已注册
Tarlan Mammadzada

2
导航到该站点,单击“高级”,然后单击“添加例外”。
理查德·史密斯

1
您希望它看起来很安全,您将需要一个自签名的CA并使用它来签署服务器的证书,然后可以将CA添加到浏览器的信任存储中。
理查德·史密斯

1
似乎Firefox已停止接受自签名证书。正如@RichardSmith所说,您需要使用证书颁发机构来生成证书。在您进入该雷区之前,您可能需要研究运营自己的授权机构的安全隐患。
garethTheRed

Answers:


10

警告:在进入运营自己的证书颁发机构的雷区之前,您可能需要研究安全隐患!

但是,如果需要,请继续阅读快速而肮脏的CA,它会在https://localhost/没有警告消息的情况下为您提供...

创建以下文本文件:

# OpenSSL configuration for Root CA

[ req ]

prompt             = no
string_mask        = default

# The size of the keys in bits:
default_bits       = 2048
distinguished_name = req_distinguished_name
x509_extensions    = x509_ext

[ req_distinguished_name ]

# Note that the following are in 'reverse order' to what you'd expect to see.

countryName = gb
organizationName = Test
commonName = Test Root CA

[ x509_ext ]

basicConstraints=critical,CA:true,pathlen:0
keyUsage=critical,keyCertSign,cRLSign

另存为,root.cnf然后使用以下命令生成请求:

$ openssl req -x509 -new -keyout root.key -out root.cer -config root.cnf

这将创建您的Root CA证书(root.cer)和您root.key必须保持私有的Root CA私钥()。它将提示您输入私钥的密码-确保您选择一个强密码。

现在为服务器证书创建一个配置文件:

# OpenSSL configuration for end-entity cert

[ req ]

prompt             = no
string_mask        = default

# The size of the keys in bits:
default_bits       = 2048
distinguished_name = req_distinguished_name

x509_extensions    = x509_ext

[ req_distinguished_name ]

# Note that the following are in 'reverse order' to what you'd expect to see.

countryName = gb
organizationName = Test
commonName = localhost

[ x509_ext ]

keyUsage=critical,digitalSignature,keyAgreement

subjectAltName = @alt_names

# Multiple Alternate Names are possible
[alt_names]
DNS.1 = localhost
# DNS.2 = altName.example.com

将其另存为server.cnf并使用以下命令生成请求:

openssl req -nodes -new -keyout server.key -out server.csr -config server.cnf

上面的代码将生成另一个server.key您必须保护的私钥()。在这种情况下,密钥不受密码保护,但是您可以通过删除该-nodes选项来添加密码。

最后,使用新的根CA和server.cnf文件扩展名对请求进行签名(为方便起见):

$ openssl x509 -req -in server.csr -CA root.cer -CAkey root.key -set_serial 123 -out server.cer -extfile server.cnf -extensions x509_ext

注意:为该-set_serial选项选择任意随机数。

它将要求您输入生成根CA时输入的密码。

server.cer将生成服务器证书()。

现在,将Root CA证书(root.cer)添加到Firefox的trust-anchor存储中,以便浏览器信任您的新CA。

通过将OpenSSL用作具有以下内容的临时Web服务器来运行测试:

$ sudo openssl s_server -key server.key -cert server.cer -accept 443 -www

注意:如果您已经在端口443上运行了服务器,则可能会出错。在这种情况下,请停止正在运行的服务器,或者通过将结尾更改为(例如),将上面的端口号更改为另一个未使用的端口。 -accept 8443 -www

当您导航到Firefox https://localhost(或https://localhost:8443如果您更改了上面的端口号)时,现在应该看不到任何警告,并且会看到一个OpenSSL安装可以提供的密码列表。

对结果满意后,将server.key和添加server.cer到原始Web服务器并进行相应配置。


1
有错别字;stinguished_name应该是distinguished_name
user281357 '18

您说:(或localhost:<port >,如果您更改了上面的端口号)...在哪里可以设置端口号?
淡啤酒

好的,抱歉,那么我没有正确理解您的解释的最后一部分。无论如何,我可以通过firefox首选项添加根证书,现在它可以正常工作了。
淡啤酒

我的问题是:“ sudo openssl ... -accept 443 -www”是什么?它会打开浏览器吗?只是检查它是否可以正确访问端口443上的localhost?它接近“将根CA添加到firefox”,因此我不清楚是要添加证书还是只是对其进行测试。(我确实记下了我的流程记录,但是我不知道如何分享它们... 80%是您的回复,所以我不会在这里将其发布为答案:-)
ale

我想知道为什么您要使用openssl而不是直接使用firefox进行测试...但是,是的,如果这是您的目标,那会更好。
麦芽酒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.