SAN(Subject Alternative Name) 是 SSL 標準 x509 中定義的一個擴展。使用了 SAN 字段的 SSL 證書,能夠擴展此證書支持的域名,使得一個證書能夠支持多個不一樣域名的解析。node
先來看一看 Google 是怎樣使用 SAN 證書的,下面是 Youtube 網站的證書信息:git
這裏能夠看到這張證書的 Common Name 字段是 *.google.com,那麼爲何這張證書卻可以被 www.youtube.com 這個域名所使用呢。緣由就是這是一張帶有 SAN 擴展的證書,下面是這張證書的 SAN 擴展信息:ide
這裏能夠看到,這張證書的 Subject Alternative Name 段中列了一大串的域名,所以這張證書可以被多個域名所使用。對於 Google 這種域名數量較多的公司來講,使用這種類型的證書可以極大的簡化網站證書的管理。網站
首先咱們將 openssl 的配置文件複製一份做臨時使用,CentOS6 中 openssl 的配置文件在 /etc/pki/tls/openssl.cnf
,將這個文件複製到 /tmp
下。google
此文件的格式是相似 ini
的配置文件格式,找到 [ req ] 段落,加上下面的配置:spa
req_extensions = v3_req
這段配置表示在生成 CSR 文件時讀取名叫 v3_req
的段落的配置信息,所以咱們再在此配置文件中加入一段名爲 v3_req
的配置:code
[ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names
這段配置中最重要的是在最後導入名爲 alt_names
的配置段,所以咱們還須要添加一個名爲 [ alt_names ]
的配置段:blog
[ alt_names ] DNS.1 = www.ustack.in DNS.2 = www.test.ustack.com
這裏填入須要加入到 Subject Alternative Names 段落中的域名名稱,能夠寫入多個。ip
接着使用這個臨時配置生成證書:ssl
$ openssl req -new -nodes -keyout ustack.key -out ustack.csr -config /tmp/openssl.cnf
查看證書請求文件的內容:
$ openssl req -text -noout -in ustack.csr
能夠看到此證書請求文件中會包含 Subject Alternative Names 字段,幷包含以前在配置文件中填寫的域名。
假設使用本機做爲子簽署 CA 對此證書請求進行簽署,簽署的方式爲:
$ openssl ca -policy policy_anything -out ustack.crt -config /tmp/openssl.cnf -extensions v3_req -infiles ustack.csr
簽署後,查看證書的內容:
$ openssl x509 -text -noout -in ustack.crt
以爲上面的方式太麻煩了?使用命令一步生成帶 SAN 擴展的證書請求文件:
$ openssl req -new -sha256 \ -key ustack.key \ -subj "/C=CN/ST=Beijing/L=Beijing/O=UnitedStack/OU=Devops/CN=www.ustack.com" \ -reqexts SAN \ -config <(cat /etc/pki/tls/openssl.cnf \ <(printf "[SAN]\nsubjectAltName=DNS:www.ustack.in,DNS:www.test.ustack.com")) \ -out ustack.csr
上面生成證書請求時的幾個字段的意義:
C => Country ST => State L => City O => Organization OU => Organization Unit CN => Common Name (證書所請求的域名) emailAddress => main administrative point of contact for the certificate
簽署上面生成的證書:
$ openssl ca -in ustack.csr \ -extensions SAN \ -config <(cat /etc/pki/tls/openssl.cnf \ <(printf "[SAN]\nsubjectAltName=DNS:www.ustack.in,DNS:www.test.ustack.com")) \ -out ustack.crt
查看證書內容:
$openssl x509 -text -noout -in ustack.crt
參考: