1

目标:我希望这个 url ( https://localhost:8083 ) 在我的本地机器上使用我的自签名证书。

首先,我引用了这个网址(https://gist.github.com/oslego/f13e136ffeaa6174289a),我所做的是:

$ openssl genrsa -des3 -out server.orig.key 2048

$ openssl rsa -in server.orig.key -out server.key

$ openssl req -new -key server.key -out server.csr

国家名称(2 个字母代码)[AU]:

...

通用名称:localhost.ssl

...

$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

$ echo "127.0.0.1 localhost.ssl" | sudo tee -a /private/etc/hosts

然后我通过执行将 server.crt 转换为 server.pem

$ openssl x509 -in server.crt -out keystore.pem -outform PEM

$ keytool -import -trustcacerts -alias testCert -file keystore.pem -keypass testpassword -keystore keystore.jks -storepass testpassword

$ keytool -export -alias mykey -keystore keystore.jks -rfc -file truststore

$ vim keystore.password // 通过 vim 手动创建 keystore.password

但是当我访问https://localhost:8083时,它不适用于 SSL。

然后,
我还创建了另一个证书

通用名称:本地主机

$ echo "127.0.0.1 本地主机" | sudo tee -a /private/etc/hosts

但这也不起作用。如何让我的https://localhost:8083 使用我的自签名证书?

仅供参考,我使用嵌入式 Jetty,Java 通过定义 keystore.jks、truststore 和 keystore.password 文件位置的配置文件正确读取所有信息。

4

1 回答 1

2

(1) 指导您进行genrsa加密然后rsa删除加密是一个很好的迹象,表明某人不知道他们在说什么,并且至少 10 年没有阅读手册页。指导你做req -new然后x509 -req -signkey是一个很好的迹象,表明某人不知道他们在说什么,并且至少 5 年没有阅读手册页。我建议完全忽略任何说这些话的网站或作者。x509 -req -signkey此外,或者或者已经是 PEM的证书输出,req -new -x509不需要任何转换。

(2) 您表示将名称翻译放入/private/etc/hosts并且不知道您正在使用什么浏览器和/或其他客户端或中间件,但我从未听说过任何使用此类的客户端用于名称解析的文件,除非您使用的是监狱或某种您没有提出问题的容器。(实际上所有的 Unix 系统都可以使用/etc/hosts,但不一样。)

(3) 你也不知道“不起作用”是什么意思。但是,如果这意味着由于密码不匹配(并非总是如此)而导致握手失败,那无疑是因为您放入了 Java 密钥库,因此当SSL/TLS 服务器需要 privatekey时,只给了 Jetty 您的证书。这使得这与链接在https://stackoverflow.com/a/37423399/2868801的多个问题重复,这些问题都解释了,细节略有不同,您需要使用这些问题openssl pkcs12 -export将证书 PLUS 私钥转换为 PKCS12 文件,然后在 Java 中使用或转换 PKCS12 文件。

(4) jww 部分正确;当前标准要求证书包含 SubjectAltName (SAN) 扩展,您应该这样做——这req -new -x509比您拥有的方法更容易,请参阅 (1)。但 到目前为止,只有 Chrome强制执行此要求,因此只有 Subject.CN 的正式过时的证书实际上将在其他客户端中工作——一旦您将它们设置为信任此证书,这对于自签名来说始终是一个问题。

于 2017-10-05T01:20:43.757 回答