OPENSSL使用方法
前置知識
KEY 通常指私鑰。
CSR 是 Certificate Signing Request 的縮寫,即證書簽名請求,這不是證書,只是包含申請證書的基本信息。生成證書時要把這個提交給權威的證書頒發機構,頒發機構審核通過之后,再根據這些申請信息生成相應的證書。
CRT 即 certificate的縮寫,即證書。
X.509 是一種證書格式。對X.509證書來說,認證者總是CA或由CA指定的人,一份X.509證書是一些標准字段的集合,這些字段包含有關用戶或設備及其相應公鑰的信息。
X.509的證書文件,一般以.crt結尾,根據該文件的內容編碼格式,可以分為以下二種格式:
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 服務器偏向於使用這種編碼格式。
設置配置文件
進OPENSSL目錄
cd d:\openssl
cd d:\openssl
set OPENSSL_CONF=openssl.cfg
生成一份 CA 根證書
1) 創建私鑰ca.key
# 輸出 key 密鑰文件。
1) 創建私鑰ca.key
# 輸出 key 密鑰文件。
openssl genrsa -des3 -out ca.key 2048 # 長度為2048
參數說明:
genras 使用 rsa 算法生成密鑰。
-des3 (可選)加密密鑰,此時需要設置密碼,后續使用該密鑰時需要驗證密碼才能使用。
-out 生成私鑰文件。
-des3 (可選)加密密鑰,此時需要設置密碼,后續使用該密鑰時需要驗證密碼才能使用。
-out 生成私鑰文件。
2) 生成證書請求文件ca.csr
# 輸入 key 文件, 輸出 csr 請求文件。
# 輸入 key 文件, 輸出 csr 請求文件。
openssl req -new -key ca.key -out ca.csr
參數說明:
參數說明:
req 產生證書簽發申請命令。
-new 新的申請。
-key 輸入的 key 文件,由第一步生成。
-out 輸出為 CSR 文件,這是一個請求文件。
-new 新的申請。
-key 輸入的 key 文件,由第一步生成。
-out 輸出為 CSR 文件,這是一個請求文件。
運行此命令后進入交互模式,需要輸入一些證書信息。
一般需要輸入的信息如下:
一般需要輸入的信息如下:
C 國家
ST 省份
L 市
O 機構
OU 部門
CN (Common Name) 一般是域名
emailAddress 郵箱
ST 省份
L 市
O 機構
OU 部門
CN (Common Name) 一般是域名
emailAddress 郵箱
3) 自簽署證書ca.crt
正常的證書是你把上面生成的請求文件(.CSR)發送給可信機構(CA),讓可信機構根據你的請求去生成和簽署證書,再給你發回來。這里是自己給自己簽署。
# 輸入 csr 請求文件,指定簽署的 key,輸出證書 crt 文件。
正常的證書是你把上面生成的請求文件(.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)。
-req 證書輸入請求。
-days 證書有效天數。
-in 輸入文件,這里是上一步生成的請求文件(.CSR)
-signkey 簽名密鑰(key)文件,由第一步生成。
-out 輸出文件,生成證書文件(.CRT)。
以上 2、3 兩步可以合成一步來執行:
# 輸入 key 文件,輸出證書 crt 文件。(自簽署)
# 輸入 key 文件,輸出證書 crt 文件。(自簽署)
openssl req -new -x509 -sha256 -days 3650 -key ca.key -out ca.crt
省去生成請求文件的步驟。
此時 CA 證書生成完成。
一般情況下,上面的 key 和 crt 可以直接拿來應用了。
以下演示把當前的證書當成 CA 給其他的請求進行頒發證書。
省去生成請求文件的步驟。
此時 CA 證書生成完成。
一般情況下,上面的 key 和 crt 可以直接拿來應用了。
以下演示把當前的證書當成 CA 給其他的請求進行頒發證書。
頒發服務器證書
1) 創建服務器私鑰server.key
# 輸出 key 密鑰文件。
1) 創建服務器私鑰server.key
# 輸出 key 密鑰文件。
openssl genrsa -out server.key 2048 # 長度為2048
參數說明:
參數說明:
genras 使用 rsa 算法生成密鑰。
-out 生成私鑰文件。
-out 生成私鑰文件。
2) 生成證書請求文件server.csr
# 輸入 key 文件, 輸出 csr 請求文件。
# 輸入 key 文件, 輸出 csr 請求文件。
openssl req -new -key server.key -out server.csr
參數說明同上一節。
參數說明同上一節。
3) 使用 CA 證書進行簽署,生成 crt 文件server.crt
# 輸入服務器給的 csr 請求文件,使用指定 CA 的私鑰和證書來簽署,輸出服務器證書 crt。
openssl x509 -req -sha256 -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
頒發客戶證書
1) 創建客戶私鑰client.key
# 輸出 key 密鑰文件。
1) 創建客戶私鑰client.key
# 輸出 key 密鑰文件。
openssl genrsa -out client.key 2048 # 長度為2048
參數說明:
參數說明:
genras 使用 rsa 算法生成密鑰。
-out 生成私鑰文件。
-out 生成私鑰文件。
2) 生成證書請求文件client.csr
# 輸入 key 文件, 輸出 csr 請求文件。
# 輸入 key 文件, 輸出 csr 請求文件。
openssl req -new -key client.key -out client.csr
參數說明同上一節。
參數說明同上一節。
3) 使用 CA 證書進行簽署,生成 crt 文件client.crt
# 輸入服務器給的 csr 請求文件,使用指定 CA 的私鑰和證書來簽署,輸出服務器證書 crt。
openssl x509 -req -sha256 -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
實踐總結
CA 證書和服務器證書的區別只有最后簽署時,是自己給自己簽署,還是讓別人給你簽署。
實際應用時需要的是私鑰(key)和證書(crt)文件。其中私鑰文件很重要,不要公開出去。證書文件可以隨意分發。
把 crt 證書文件加入可信任的根機構中,則該證書和其簽署的所有證書都會被信任。那么在一個機構內部可以自建一個 CA 證書,CA 證書加入可信列表,然后機構內部的所有其他證書都使用該證書來簽署,則只需要信任一次就夠了。
實際應用時需要的是私鑰(key)和證書(crt)文件。其中私鑰文件很重要,不要公開出去。證書文件可以隨意分發。
把 crt 證書文件加入可信任的根機構中,則該證書和其簽署的所有證書都會被信任。那么在一個機構內部可以自建一個 CA 證書,CA 證書加入可信列表,然后機構內部的所有其他證書都使用該證書來簽署,則只需要信任一次就夠了。
nginx 中使用 ssl 的方式是,在配置文件中加入以下語句:
ssl_certificate /path/to/your.crt;
ssl_certificate_key /path/to/your.key;
ssl_certificate /path/to/your.crt;
ssl_certificate_key /path/to/your.key;
對於 IIS 的設置
在 IIS 中,需要的是一個 PFX 文件,這個文件需要包含 key 和 crt。生成方法如下:
# 輸入 key 和 crt 文件,輸出 pfx 文件。
在 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 中打開計算機級別的證書管理器)。
執行上述命令時,會要求輸入一個 export 密碼。 該密碼在導入 pfx 文件時需要。
在 IIS 中選擇“導入證書”,文件選擇該 pfx 文件,密碼填寫導出時的密碼,導入位置選擇“個人”。
如要修改證書的 friendly name ,則在證書管理中修改(需要從 mmc 中打開計算機級別的證書管理器)。
解決 Chrome 報 missing_subjectAltName 的問題
chrome 會查看當前域名是否在證書中聲明,該聲明由 subjectAltName 字段設置。上述的生成步驟默認未設置該字段。
解決方法如下:
新建一個文件,起名為 v3.ext (名字自定),編輯內容如下:
subjectAltName = @alt_names
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
# 這是上面服務器簽署的示例,只在最后增加一個參數,指定擴展字段的配置文件。
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
更多用法
1) 通過配置文件,非交互式生成證書請求文件(CSR)
新建一個文件,如 my.cnf ,相應字段按自己需求修改:
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = req_distinguished_name
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 = admin@myserver.com
在生成請求文件時,額外增加參數: **-config my.cnf **
# 指定配置文件,此時不會出現交互模式,相交信息自動設置。
C = CN
ST = GuangDong
L = ShenZhen
O = your_company
OU = your_organize
CN = www.myserver.com
emailAddress = admin@myserver.com
在生成請求文件時,額外增加參數: **-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
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 = admin@myserver.com
C = CN
ST = GuangDong
L = ShenZhen
O = your_company
OU = your_organize
CN = www.myserver.com
emailAddress = admin@myserver.com
[v3_req]
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
keyUsage = critical, digitalSignature, keyAgreement
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = myserver.com
DNS.2 = *.myserver.com
然后運行如下命令:
# 一句命令,輸入配置文件 my.conf, 輸出 key 和 crt 文件。適合於自簽署證書。
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