我正在使用Vagrant和Ansible角色生成SSL / TLS证书,但无论我尝试什么,生成的证书都缺少主题备用名称:
- name: Create an SSL security key & CSR (Certificate Signing Request)
shell: openssl req -new -newkey rsa:2048 -nodes -keyout /etc/apache2/ssl/{{ item.host }}.key -subj "/subjectAltName=DNS.1={{ item.host }}, DNS.2=www.{{ item.host }}, IP.1=192.168.33.11/C={{params['ssl'].country_name}}/ST={{params['ssl'].state}}/L={{params['ssl'].locality}}/O={{params['ssl'].organization}}/CN={{ item.host }}" -out /etc/apache2/ssl/{{ item.host }}.csr
args:
executable: "/bin/bash"
with_items: "{{params['vhosts']}}"
when: item.ssl is defined and item.ssl
证书文件已生成,但Google Chrome总是说
Subject Alternative Name Missing
这是我的环境的调试:
$ openssl version
OpenSSL 1.0.2l 25 May 2017
$ openssl x509 -noout -text -in /etc/apache2/ssl/myhost.dev.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
a2:77:35:c7:6a:72:35:22
Signature Algorithm: sha256WithRSAEncryption
Issuer: subjectAltName=DNS.1=myhost.dev, DNS.2=www.myhost.dev, IP.1=192.168.33.11, C=DE, ST=Berlin, L=Berlin, O=Ltd, CN=myhost.dev
Validity
Not Before: Jun 12 15:36:58 2017 GMT
Not After : Jun 10 15:36:58 2027 GMT
Subject: subjectAltName=DNS.1=myhost.dev, DNS.2=www.myhost.dev, IP.1=192.168.33.11, C=DE, ST=Berlin, L=Berlin, O=Ltd, CN=myhost.dev
答案 0 :(得分:2)
您的密钥未使用X509扩展程序。要将它们添加到CSR,您需要一个配置文件,指定要添加的扩展名。命令行界面不够友好,无法在命令行上轻松指定X509扩展名。
当您调用openssl
生成CSR时,您可以使用Bash的流程替换以及生成修改后的配置文件动态的命令:
openssl req \
-new -newkey rsa:2048 \
-subj "{your existing subject}" \
... \
-x509 \
-reqexts SAN \
-config <(
cat /etc/ssl/openssl.cnf
printf '\n[SAN]\nsubjectAltName=DNS:example.com,DNS:www.example.com'
)
同样,process substitution 仅在GNU bash中工作,如果您的CI运行器的默认shell是Bourne Shell,则无法工作,因为它有时位于基于Ubuntu的发行版上。
这个答案改编自here。
答案 1 :(得分:1)
在对openssl库进行一些研究并了解它是如何工作之后,我犯了使用-X509 *的错误:添加-X509将创建证书而不是请求!
我按照以下主要步骤解决了我的问题:
我写了一篇关于如何在blog post上实现这一目标的一步一步的长篇教程。