使用 openssl 生成證書

1. 前置知識

KEY 通常指私鑰。

CSR 是 Certificate Signing Request 的縮寫,即證書籤名請求,這不是證書,只是包含申請證書的基本信息。生成證書時要把這個提交給權威的證書頒發機構,頒發機構審覈通過之後,再根據這些申請信息生成相應的證書。

CRT 即 certificate的縮寫,即證書。

X.509 是一種證書格式。對X.509證書來說,認證者總是CA或由CA指定的人,一份X.509證書是一些標準字段的集合,這些字段包含有關用戶或設備及其相應公鑰的信息。

X.509的證書文件,一般以.crt結尾,根據該文件的內容編碼格式,可以分爲以下二種格式

  • PEM - Privacy Enhanced Mail,打開看文本格式,以"-----BEGIN…“開頭,”-----END…"結尾,內容是 BASE64 編碼。Apache 和 *NIX 服務器偏向於使用這種編碼格式。

  • DER - Distinguished Encoding Rules,打開看是二進制格式,不可讀。Java 和 Windows 服務器偏向於使用這種編碼格式。

2. 生成一份 CA 根證書

1) 創建私鑰

# 輸出 key 密鑰文件。

openssl genrsa -des3 -out ca.key 2048   # 長度爲2048

參數說明:

  • genras 使用 rsa 算法生成密鑰。
  • -des3 (可選)加密密鑰,此時需要設置密碼,後續使用該密鑰時需要驗證密碼才能使用。
  • -out 生成私鑰文件。

2) 生成證書請求文件(CSR)

# 輸入 key 文件, 輸出 csr 請求文件。

openssl req -new -key ca.key -out ca.csr

參數說明:

  • req 產生證書籤發申請命令。
  • -new 新的申請。
  • -key 輸入的 key 文件,由第一步生成。
  • -out 輸出爲 CSR 文件,這是一個請求文件。

運行此命令後進入交互模式,需要輸入一些證書信息。

一般需要輸入的信息如下:

  • C 國家
  • ST 省份
  • L
  • O 機構
  • OU 部門
  • CN (Common Name) 一般是域名
  • emailAddress 郵箱

3) 自簽署證書

正常的證書是你把上面生成的請求文件(.CSR)發送給可信機構(CA),讓可信機構根據你的請求去生成和簽署證書,再給你發回來。這裏是自己給自己簽署。

# 輸入 csr 請求文件,指定簽署的 key,輸出證書 crt 文件。

openssl x509 -req -sha256 -days 3650 -in ca.csr -signkey ca.key -out ca.crt

參數說明:

  • x509 簽發X.509格式證書命令。
  • -req 證書輸入請求。
  • -days 證書有效天數。
  • -in 輸入文件,這裏是上一步生成的請求文件(.CSR)
  • -signkey 簽名密鑰(key)文件,由第一步生成。
  • -out 輸出文件,生成證書文件(.CRT)。

以上 2、3 兩步可以合成一步來執行:

# 輸入 key 文件,輸出證書 crt 文件。(自簽署)

openssl req -new -x509 -sha256 -days 3650 -key ca.key -out ca.crt

省去生成請求文件的步驟。

此時 CA 證書生成完成。

一般情況下,上面的 key 和 crt 可以直接拿來應用了。
以下演示把當前的證書當成 CA 給其他的請求進行頒發證書。

3. 頒發服務器證書

1) 創建服務器私鑰

# 輸出 key 密鑰文件。

openssl genrsa -out server.key 2048   # 長度爲2048

參數說明:

  • genras 使用 rsa 算法生成密鑰。
  • -out 生成私鑰文件。

2) 生成證書請求文件(CSR)

# 輸入 key 文件, 輸出 csr 請求文件。

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

參數說明同上一節。

3) 使用 CA 證書進行簽署,生成 crt 文件

# 輸入服務器給的 csr 請求文件,使用指定 CA 的私鑰和證書來簽署,輸出服務器證書 crt。

openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

4. 實踐總結

  • CA 證書和服務器證書的區別只有最後簽署時,是自己給自己簽署,還是讓別人給你簽署。
  • 實際應用時需要的是私鑰(key)和證書(crt)文件。其中私鑰文件很重要,不要公開出去。證書文件可以隨意分發。
  • 把 crt 證書文件加入可信任的根機構中,則該證書和其簽署的所有證書都會被信任。那麼在一個機構內部可以自建一個 CA 證書,CA 證書加入可信列表,然後機構內部的所有其他證書都使用該證書來簽署,則只需要信任一次就夠了。

nginx 中使用 ssl 的方式是,在配置文件中加入以下語句:

ssl_certificate     /path/to/your.crt;
ssl_certificate_key /path/to/your.key;

5. 對於 IIS 的設置

在 IIS 中,需要的是一個 PFX 文件,這個文件需要包含 key 和 crt。生成方法如下:

# 輸入 key 和 crt 文件,輸出 pfx 文件。

openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx

執行上述命令時,會要求輸入一個 export 密碼。 該密碼在導入 pfx 文件時需要。

在 IIS 中選擇“導入證書”,文件選擇該 pfx 文件,密碼填寫導出時的密碼,導入位置選擇“個人”。

如要修改證書的 friendly name ,則在證書管理中修改(需要從 mmc 中打開計算機級別的證書管理器)。

6. 解決 Chrome 報 missing_subjectAltName 的問題

chrome 會查看當前域名是否在證書中聲明,該聲明由 subjectAltName 字段設置。上述的生成步驟默認未設置該字段。

解決方法如下:

新建一個文件,起名爲 v3.ext (名字自定),編輯內容如下:

subjectAltName = @alt_names

[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = *.company.net

域名要與你的證書實際綁定的域名一致。如有多個域名,按示例寫多個。

在簽署時,額外增加一個參數: -extfile v3.ext

# 這是上面服務器簽署的示例,只在最後增加一個參數,指定擴展字段的配置文件。

openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile v3.ext

7. 更多用法

1) 通過配置文件,非交互式生成證書請求文件(CSR)

新建一個文件,如 my.cnf ,相應字段按自己需求修改:

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = req_distinguished_name

[req_distinguished_name]
C  = CN
ST = GuangDong
L  = ShenZhen
O  = your_company
OU = your_organize
CN = www.myserver.com
emailAddress = [email protected]

在生成請求文件時,額外增加參數: **-config my.cnf **

# 指定配置文件,此時不會出現交互模式,相交信息自動設置。

openssl req -new -key server.key -out server.csr -config my.cnf

2) 一句話生成 key 和 crt 文件

該情形適合於自簽署證書時。

請求的配置和 ext 的配置可以寫在一起,如下

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = req_distinguished_name
x509_extensions = v3_req

[req_distinguished_name]
C  = CN
ST = GuangDong
L  = ShenZhen
O  = your_company
OU = your_organize
CN = www.myserver.com
emailAddress = [email protected]

[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = myserver.com
DNS.2 = *.myserver.com

然後運行如下命令:

# 一句命令,輸入配置文件 my.conf, 輸出 key 和 crt 文件。適合於自簽署證書。

openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:1024 -keyout app.key -out app.crt  -config my.conf

8. 自制腳本

參見: https://github.com/ljskr/ssl_tool

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章