使用 OpenSSL 製做一個包含 SAN(Subject Alternative Name)的證書

什麼是 SAN

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 生成帶有 SAN 擴展的證書請求文件(CSR)

首先咱們將 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 字段,幷包含以前在配置文件中填寫的域名。

使用 openssl 簽署帶有 SAN 擴展的證書請求

假設使用本機做爲子簽署 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

 

參考:

相關文章
相關標籤/搜索