我正在尝试为安全的grpc通信生成自签名证书。以下是我尝试过的,服务之间的连接在localhost上工作得很好。
然而,当我将其中一个服务部署到生产环境(Google Cloud Run)时,连接停止工作。如何使证书支持本地主机或生产环境中的连接?
下面是我尝试过的证书生成脚本。
generator.sh
# Clean Up
rm *.crt
echo "Generating certificates ..."
openssl genrsa -passout pass:1111 -des3 -out ca.key 4096
openssl req -passin pass:1111 -new -x509 -days 365 -key ca.key -out ca.crt -subj "/C=CL/ST=RM/L=Santiago/O=Test/OU=Test/CN=ca"
openssl genrsa -passout pass:1111 -des3 -out server.key 4096
openssl req -passin pass:1111 -new -key server.key -out server.csr -subj "/C=CL/ST=RM/L=Santiago/O=Test/OU=Server/CN=localhost"
openssl x509 -req -passin pass:1111 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
openssl rsa -passin pass:1111 -in server.key -out server.key
openssl genrsa -passout pass:1111 -des3 -out client.key 4096
openssl req -passin pass:1111 -new -key client.key -out client.csr -subj "/C=CL/ST=RM/L=Santiago/O=Test/OU=Client/CN=localhost"
openssl x509 -passin pass:1111 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
openssl rsa -passin pass:1111 -in client.key -out client.key
我如何使服务之间的连接工作所有的时间,无论是在本地主机或在生产中,在我自己的情况下是谷歌云运行(*.run.app
)?
谢谢。
您的标题显示"证书中的多个通用名称";但你的身体有效地说(两次)"既适用于本地主机,也适用于其他主机"。这是完全不同的。X.509证书结构非常灵活,在技术上可以在Subject中创建一个具有多个CommonName属性的证书,但如果用于SSL/TLS(包括HTTPS),在确定证书有效性时只会考虑其中一个;参见rfc2818和rfc6125。
有两种方法可以使证书可用于多个服务器名称,实际上可以是一个服务器的多个名称(在虚拟主机中很常见)或不同的服务器(您的情况):
-
使用通配符名称。如果您使所有机器的名称仅在第一个DNS标签中变化,例如您发布的模式
*.run.app
,则可以使用包含该通配符的CommonName。如果你的"本地主机"实际上是你自己的计算机或虚拟机,你可以使用/etc/hosts或本地DNS,如dnsmasq或unbound给分配一个与此模式匹配的名称,如myownmachine.run.app
,这将与此证书一起工作。 -
使用主题可选名称/SAN扩展,该扩展可以包含多个值,每个值都是DNS名称或通配符或IP地址(您可能不想要后者,但它是可用的)。自2010年以来,所有来自真实(公共)ca的证书都使用SAN。对于OpenSSL中的SAN,请参见start
添加SAN与私有CA
请求的扩展在CSR中没有反映在CRT
自签名SSL证书:主题选择的名字(SAN)丢失时签署
https://security.stackexchange.com/questions/204036/specify-subject-alt-names-in-openssl
https://security.stackexchange.com/questions/190905/subject-alternative-name-in-certificate-signing-request-
https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate
https://security.stackexchange.com/questions/74345/provide-subjectaltname-to-openssl-directly-on-command-line