OpenSSL(1)密鑰和證書管理

OpenSSL是一個開源項目,包括密碼庫和SSL/TLS工具集。 從項目的官方站點能夠看到:
  OpenSSL項目是安全套接字層( secure sockets layer, SSL)和傳輸層安全( transport layer security, TLS)協議的一個實現,是你們共同努力開發出的代碼可靠、功能齊全、商業級別的開源工具集。項目由遍及世界的志願者所組成的社區進行管理,他們經過互聯網進行溝通、計劃和開發OpenSSL工具集以及相關的文檔。
git

       OpenSSL在這一領域已經成爲事實上的標準,而且擁有比較長的歷史。如今幾乎全部的服務器軟件和不少客戶端軟件都在使用OpenSSL,其中基於命令行的工具是進行密鑰、證書管理以及測試最經常使用到的軟件了。 web

肯定 OpenSSL 版本和配置

查看ubuntu版本算法

查看OpenSSL版本ubuntu

上面最後一行的輸出( /usr/lib/ssl)是OpenSSL默認狀況下查找配置和證書的目錄 。瀏覽器

misc/目錄包含一些補充腳本,其中最有用的腳本容許你實現一個私有的證書頒發機構。 安全

查看可用命令

第一部分標準命令Standard commands列出了全部可使用的工具。若是對於某個命令,想獲取更加詳細的信息,可使用man加上工具的名稱。例如man ciphers會告訴咱們密碼套件是如何配置的。服務器

第二部分消息摘要命令Message Digest commands展現了可用的消息摘要命令。
併發

第三部分加密命令Cipher commands 展現了全部的加密命令 。
dom

建立可信證書庫

OpenSSL沒有自帶可信根證書(也叫做可信證書庫),因此若是你是本身從頭開始安裝的話,那麼就須要從別的地方找找了。一種選擇是使用操做系統自帶的可信證書庫,通常來講沒有問題,可是這個可信證書庫可能不是最新的。更好的一種選擇是從Mozilla那裏獲取,雖然麻煩一點 。
socket

密鑰和證書管理

多數用戶藉助OpenSSL是由於但願配置並運行可以支持SSL的Web服務器。整個過程包括3個步驟: (1) 生成強加密的私鑰; (2) 建立證書籤名申請( certificate signing request, CSR)而且發送給CA(3) 在你的Web服務器上安裝CA提供的證書。

生成密鑰

如今,通常認爲2048位的RSA密鑰是安全的,因此你應該採用這個長度的密鑰。 DSA密鑰也應該很多於2048位, ECDSA密鑰則應該是256位以上。

使用genrsa命令來生成RSA密鑰

openssl genrsa -aes128 -out fd.key 2048

這裏,我指定私鑰會使用AES-128算法來加密保存。

私鑰以所謂的PEM格式存儲,該格式僅包含文本:

cat fd.key

乍一看私鑰是一堆隨機數據,其實不是。你可使用下面的rsa命令解析出私鑰的結構

openssl rsa -text -in fd.key
Private-Key: (2048 bit) modulus: 00:b3:02:c2:68:7a:bd:b3:11:47:98:d9:25:e1:21: d8:16:84:aa:e7:23:85:aa:f9:38:8f:e2:7f:d1:b5: 2f:76:c8:5a:d9:75:f9:6c:d2:54:dd:e0:b2:be:3c: f6:eb:9b:0e:3d:b6:37:eb:02:d1:44:09:09:40:f8: 4d:5d:1d:41:1d:53:79:dc:b1:55:2e:e7:8b:0a:62: b7:07:2e:55:ef:fc:92:96:6a:ef:3c:27:0a:74:17: 8e:57:b7:79:d5:83:5f:cc:53:a9:e6:b9:8a:fa:00: 23:b9:ec:78:e2:a3:69:81:ac:28:3e:06:cb:92:05: db:35:7b:00:b3:fc:52:da:2a:17:1c:14:67:67:ad: 1f:d4:e2:80:51:9f:40:4c:b8:a7:3e:9a:8b:2e:f8: 5c:a7:dd:73:55:84:c7:4d:9b:eb:24:0a:c7:b6:b0: 57:fc:96:a2:9a:81:14:18:dc:20:db:8b:d1:31:e1: 5d:01:78:23:cb:20:1d:c2:a4:fc:bd:da:b2:16:fc: 63:22:b9:31:d1:50:21:78:07:b6:91:9e:47:10:de: 80:3d:d4:8e:bb:cb:d0:ca:ba:8e:7b:6d:ba:3c:b5: 9a:af:49:96:8a:6f:72:bc:cc:a8:73:07:1f:8e:d3: 77:99:98:72:9e:35:eb:01:70:ee:f5:75:33:e9:ff: e3:e5 publicExponent: 65537 (0x10001) privateExponent: 7b:17:b5:a8:f4:65:c7:61:65:73:34:36:78:e5:b5: da:5e:25:ca:c4:c1:60:7c:f9:28:ef:9d:e7:0d:08: f3:4b:f8:34:ba:8b:e6:09:87:b3:fe:93:ca:7e:cf: 67:d9:7a:64:73:0d:66:7b:cc:7c:55:1e:58:df:a5: 0b:17:57:b4:1b:b7:9b:4b:11:81:2c:54:8e:b2:ac: 9a:b2:81:03:82:11:26:7f:a7:bc:1c:38:72:f5:d3: ba:7b:7e:ba:94:18:e6:be:cd:00:cb:ab:46:17:9c: 79:77:a2:f4:6d:5b:da:80:10:37:fe:a2:32:e9:f5: ff:83:72:4b:51:81:83:63:f1:89:7b:7e:80:35:5e: 55:92:8e:11:8c:bb:d8:36:b8:34:02:6d:ed:14:e0: 09:1a:d2:ea:90:d3:b8:04:cc:c3:48:1d:10:30:39: da:e2:ab:a9:f5:a8:83:3b:54:6e:1f:8e:2d:6a:7e: 5b:2c:ef:0f:6b:b2:d9:33:d1:68:f7:b7:7b:ca:8f: bf:33:f6:77:0d:88:f9:18:db:cc:be:16:93:d0:92: be:8a:22:8c:aa:da:fa:80:59:eb:69:85:d3:ff:de: c1:58:fd:5b:92:37:21:56:eb:56:ad:c4:d0:dd:96: cd:55:e6:97:ed:e4:15:fb:10:de:a3:8e:75:0e:c7: 2d prime1: 00:d9:48:10:0b:85:a5:bb:98:ef:03:89:05:37:74: 9a:97:2b:00:cf:6e:3a:bd:a2:8e:b0:a4:e9:de:32: 72:14:a8:50:4d:de:b7:d1:fa:bc:3c:43:97:c6:fe: d2:24:a2:da:56:ff:40:be:75:bf:ee:63:bf:04:50: dc:d3:8d:ea:31:77:11:f8:b1:48:55:39:c5:f1:92: 46:df:34:68:47:8f:70:3d:72:5c:b8:a7:3d:31:14: 44:38:f5:ff:2d:38:78:08:34:d0:2b:80:8b:63:fb: bc:40:e1:29:91:37:99:f4:0b:36:5a:e5:42:19:81: ec:e0:22:30:8c:8e:38:7c:3f prime2: 00:d2:e8:dd:6d:e5:e7:62:2c:24:74:fb:c1:e3:52: d6:f7:78:29:7d:39:03:65:76:d3:57:84:10:78:7f: b1:08:9d:68:ee:f7:5c:50:d7:51:a0:e5:e8:ca:fc: 7d:2e:18:64:9a:c8:46:89:4d:49:86:5b:73:83:bf: 66:21:ac:45:98:b5:37:ce:6e:1f:ff:c1:5a:f5:2f: 1b:e1:67:75:a3:0f:06:cd:17:24:24:69:90:f5:ed: 2b:c8:b8:9c:be:ab:1f:a8:ba:79:6c:eb:e3:4d:c5: c3:00:5c:17:6c:1d:de:c4:50:ff:d8:7c:6e:ef:8b: 41:c8:40:08:a7:60:b3:e6:db exponent1: 00:8c:b1:40:d2:75:23:af:a9:83:7a:c2:8a:82:32: 1a:b7:af:bc:c2:94:19:ad:19:49:53:d0:35:2f:0f: 73:17:35:35:6a:76:c0:88:52:d6:f8:1e:bc:74:ba: 23:d0:5d:33:0c:0a:14:1e:3f:98:9c:00:32:7b:d4: f0:68:7c:08:1d:27:80:97:8c:13:ce:3b:ae:94:91: a7:1a:78:90:dd:65:5f:c4:29:fd:28:04:02:77:79: 2c:03:c6:26:09:5d:fb:3b:35:17:66:53:c1:ee:67: de:aa:14:22:1a:49:ea:82:3f:90:5e:a2:fc:7e:0f: c7:16:0a:8d:6d:35:da:15:79 exponent2: 00:87:07:3b:2c:ae:f2:32:72:1c:6d:20:f9:82:f6: 78:56:3b:82:24:7f:a9:e2:fd:ee:54:ab:62:78:23: 18:4e:71:a8:ca:c5:67:3f:02:7b:6a:4d:87:7a:dd: a7:af:29:42:cf:ad:c5:2b:06:66:3a:34:b6:81:f4: ba:08:78:e8:9d:d9:f7:7e:9c:16:b4:81:30:20:a5: 26:6e:6a:f4:6f:8e:a1:46:10:b8:bc:ef:31:35:a1: c0:54:63:8d:46:ac:fc:39:e4:18:f5:59:18:4f:a4: 7b:31:f1:c3:b5:1e:72:8e:b1:64:fb:4e:bf:1f:71: c2:8d:d8:21:32:37:c1:35:dd coefficient: 00:9a:f0:08:62:0b:0d:0c:d0:ff:23:f1:06:8d:e4: 8f:db:7d:16:f5:33:d5:6c:d1:dc:1e:d1:35:33:a1: 4f:7b:e4:ef:ed:eb:ac:a1:36:a1:87:44:f3:e1:d2: 24:3b:45:c0:d3:47:92:63:ec:ec:06:aa:a4:da:9c: f4:0b:97:70:26:d1:c1:33:d8:40:ca:b7:46:95:e3: a3:f6:ed:be:76:bf:1d:ee:71:a8:0f:9e:73:9a:e3: 5c:a1:d4:c3:03:77:29:ea:47:64:a4:e0:ac:4d:c4: 25:ea:cf:4a:15:58:fa:bb:b0:bd:7d:0c:cd:0f:23: fc:9b:a8:72:fb:29:40:72:a7 writing RSA key -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAswLCaHq9sxFHmNkl4SHYFoSq5yOFqvk4j+J/0bUvdsha2XX5 bNJU3eCyvjz265sOPbY36wLRRAkJQPhNXR1BHVN53LFVLueLCmK3By5V7/ySlmrv PCcKdBeOV7d51YNfzFOp5rmK+gAjuex44qNpgawoPgbLkgXbNXsAs/xS2ioXHBRn Z60f1OKAUZ9ATLinPpqLLvhcp91zVYTHTZvrJArHtrBX/JaimoEUGNwg24vRMeFd AXgjyyAdwqT8vdqyFvxjIrkx0VAheAe2kZ5HEN6APdSOu8vQyrqOe226PLWar0mW im9yvMyocwcfjtN3mZhynjXrAXDu9XUz6f/j5QIDAQABAoIBAHsXtaj0ZcdhZXM0 NnjltdpeJcrEwWB8+SjvnecNCPNL+DS6i+YJh7P+k8p+z2fZemRzDWZ7zHxVHljf pQsXV7Qbt5tLEYEsVI6yrJqygQOCESZ/p7wcOHL107p7frqUGOa+zQDLq0YXnHl3 ovRtW9qAEDf+ojLp9f+DcktRgYNj8Yl7foA1XlWSjhGMu9g2uDQCbe0U4Aka0uqQ 07gEzMNIHRAwOdriq6n1qIM7VG4fji1qflss7w9rstkz0Wj3t3vKj78z9ncNiPkY 28y+FpPQkr6KIoyq2vqAWetphdP/3sFY/VuSNyFW61atxNDdls1V5pft5BX7EN6j jnUOxy0CgYEA2UgQC4Wlu5jvA4kFN3SalysAz246vaKOsKTp3jJyFKhQTd630fq8 PEOXxv7SJKLaVv9AvnW/7mO/BFDc043qMXcR+LFIVTnF8ZJG3zRoR49wPXJcuKc9 MRREOPX/LTh4CDTQK4CLY/u8QOEpkTeZ9As2WuVCGYHs4CIwjI44fD8CgYEA0ujd beXnYiwkdPvB41LW93gpfTkDZXbTV4QQeH+xCJ1o7vdcUNdRoOXoyvx9LhhkmshG iU1Jhltzg79mIaxFmLU3zm4f/8Fa9S8b4Wd1ow8GzRckJGmQ9e0ryLicvqsfqLp5 bOvjTcXDAFwXbB3exFD/2Hxu74tByEAIp2Cz5tsCgYEAjLFA0nUjr6mDesKKgjIa t6+8wpQZrRlJU9A1Lw9zFzU1anbAiFLW+B68dLoj0F0zDAoUHj+YnAAye9TwaHwI HSeAl4wTzjuulJGnGniQ3WVfxCn9KAQCd3ksA8YmCV37OzUXZlPB7mfeqhQiGknq gj+QXqL8fg/HFgqNbTXaFXkCgYEAhwc7LK7yMnIcbSD5gvZ4VjuCJH+p4v3uVKti eCMYTnGoysVnPwJ7ak2Het2nrylCz63FKwZmOjS2gfS6CHjondn3fpwWtIEwIKUm bmr0b46hRhC4vO8xNaHAVGONRqz8OeQY9VkYT6R7MfHDtR5yjrFk+06/H3HCjdgh MjfBNd0CgYEAmvAIYgsNDND/I/EGjeSP230W9TPVbNHcHtE1M6FPe+Tv7eusoTah h0Tz4dIkO0XA00eSY+zsBqqk2pz0C5dwJtHBM9hAyrdGleOj9u2+dr8d7nGoD55z muNcodTDA3cp6kdkpOCsTcQl6s9KFVj6u7C9fQzNDyP8m6hy+ylAcqc= -----END RSA PRIVATE KEY-----
View Code

若是你須要單獨查看密鑰的公開部分,可使用下面的rsa命令:

openssl rsa -in fd.key -pubout -out fd-public.key

查看這個剛生成的文件,就會發現有明顯的標識,表示這部分確實是公開的信息(公鑰):

建立證書籤名申請

一旦有了私鑰,就能夠建立證書籤名申請( certificate signing request, CSR)。這是要求CA給證書籤名的一種正式申請,該申請包含申請證書的實體的公鑰以及該實體的某些信息。該數據將成爲證書的一部分。 CSR始終使用它攜帶的公鑰所對應的 私鑰 對證書 進行簽名。

CSR建立的過程通常都是交互式的,你須要提供區分證書所需的不一樣元素。若是你想讓某一個字段爲空,不要直接回車,必須輸入一個點( .);若是直接回車,OpenSSL會直接使用這個字段默認的值。

root@ubuntu:/usr# openssl req -new -key fd.key -out fd.csr Enter pass phrase for fd.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:JP^H^H^[[3~^H^[[D^[[D^[[C^[[A^[[B^C root@ubuntu:/usr# openssl req -new -key fd.key -out fd.csr Enter pass phrase for fd.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:cn State or Province Name (full name) [Some-State]:JPprovince Locality Name (eg, city) []:JiNan Organization Name (eg, company) [Internet Widgits Pty Ltd]:jpconpany Organizational Unit Name (eg, section) []:jpsection Common Name (e.g. server FQDN or YOUR name) []:jpserver.test.com Email Address []:xdyixia@163.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:.
根據RFC 2985的5.4.1節①, 質詢密碼( challenge password)是一個可選字段,用於在證書吊銷過程當中確認申請過該證書的最初實體的身份。若是輸入這個字段,則會將密碼包括在CSR文件中併發送給CA。幾乎沒有CA會依賴這個字段,我所看到的幫助信

CSR生成以後,可使用它去直接進行證書籤名或者將它發送給公共CA讓他們對證書進行簽名。下面會具體講這兩種方式,可是在操做以前,最好再檢查一遍CSR是正確的。能夠這麼作:

root@ubuntu:/usr# openssl req -text -in fd.csr -noout Certificate Request: Data: Version: 0 (0x0) Subject: C=cn, ST=JPprovince, L=JiNan, O=jpconpany, OU=jpsection, CN=jpserver.test.com/emailAddress=xdyixia@163.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b3:02:c2:68:7a:bd:b3:11:47:98:d9:25:e1:21: d8:16:84:aa:e7:23:85:aa:f9:38:8f:e2:7f:d1:b5: 2f:76:c8:5a:d9:75:f9:6c:d2:54:dd:e0:b2:be:3c: f6:eb:9b:0e:3d:b6:37:eb:02:d1:44:09:09:40:f8: 4d:5d:1d:41:1d:53:79:dc:b1:55:2e:e7:8b:0a:62: b7:07:2e:55:ef:fc:92:96:6a:ef:3c:27:0a:74:17: 8e:57:b7:79:d5:83:5f:cc:53:a9:e6:b9:8a:fa:00: 23:b9:ec:78:e2:a3:69:81:ac:28:3e:06:cb:92:05: db:35:7b:00:b3:fc:52:da:2a:17:1c:14:67:67:ad: 1f:d4:e2:80:51:9f:40:4c:b8:a7:3e:9a:8b:2e:f8: 5c:a7:dd:73:55:84:c7:4d:9b:eb:24:0a:c7:b6:b0: 57:fc:96:a2:9a:81:14:18:dc:20:db:8b:d1:31:e1: 5d:01:78:23:cb:20:1d:c2:a4:fc:bd:da:b2:16:fc: 63:22:b9:31:d1:50:21:78:07:b6:91:9e:47:10:de: 80:3d:d4:8e:bb:cb:d0:ca:ba:8e:7b:6d:ba:3c:b5: 9a:af:49:96:8a:6f:72:bc:cc:a8:73:07:1f:8e:d3: 77:99:98:72:9e:35:eb:01:70:ee:f5:75:33:e9:ff: e3:e5 Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha256WithRSAEncryption a9:af:22:f5:5e:d8:18:bb:e0:ea:e3:08:70:a7:a9:5b:02:42: f7:9f:99:d4:1b:41:54:58:9b:63:a7:20:9e:28:04:dd:b2:d5: 1f:5e:83:3b:ef:b8:d9:37:98:37:da:09:a9:2e:4f:3c:fd:c1: a6:c2:ea:b7:97:ce:0f:fb:48:d4:0c:89:3b:fe:d2:ee:ae:ee: b3:18:bc:f5:36:79:ea:08:de:37:41:a4:6b:44:9d:32:98:7b: a0:b4:eb:9e:40:bc:43:ce:43:62:4e:a6:6c:98:f8:47:13:1d: eb:e0:d5:9d:55:05:cc:01:9a:ee:5d:86:b1:ba:c8:cd:0d:62: 1c:a5:6c:60:ec:ed:89:96:50:57:ac:45:7c:b2:a3:fe:7d:10: a9:da:67:1c:03:99:ff:be:f3:60:b7:b6:db:6c:50:82:01:3c: 6b:4c:cb:dc:c6:51:f2:ff:0d:86:86:8f:67:cb:66:be:d0:d4: 44:59:9a:e8:dc:9a:c7:53:0c:50:5a:f5:98:58:1d:61:90:59: ab:de:27:e3:ff:2f:98:29:7f:ab:5f:17:a4:a1:ab:36:82:93: ba:7a:f8:ea:92:91:4a:85:de:4b:16:56:a7:15:f3:e4:eb:ff: a8:94:11:68:d8:b5:fb:a0:e1:d4:1c:09:0a:4f:e9:23:3d:80: 4b:79:48:35
View Code

用當前證書生成 CSR 文件 

若是你想更新一張證書而且不想對裏面的信息做任何更改,那麼實現能夠變得簡單一些。使用下面的命令能夠用當前的證書建立一個全新的CSR文件:

openssl x509 -x509toreq -in fd.crt -out fd.csr -signkey fd.key

非交互方式生成 CSR

能夠先建立一個fd.cnf文件

[req] prompt = no distinguished_name = dn req_extensions = ext input_password = PASSPHRASE [dn] CN = www.feistyduck.com emailAddress = webmaster@feistyduck.com O = Feisty Duck Ltd L = London C = GB [ext] subjectAltName = DNS:www.feistyduck.com,DNS:feistyduck.com
View Code

而後使用下面的命令直接建立CSR文件:

openssl req -new -config fd.cnf -key fd.key -out fd.csr

自簽名證書

若是你只是想安裝一臺本身使用的TLS服務器,那麼能夠沒必要找CA去獲取一個公開信任的證書,本身就能夠直接簽發一個。最簡單的方式就是生成自簽名證書。若是你使用Firefox,那麼能夠在第一次訪問網站的時候建立一個證書例外,而後就能夠像使用公開可信證書同樣正常訪問了。

若是已經有了CSR,可使用下面的文件建立證書:

openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd.crt

也能夠無需單首創建一個CSR,使用下面的命令直接使用私鑰建立自簽名證書:

openssl req -new -x509 -days 365 -key fd.key -out fd.crt

若是你不想有交互提示,直接使用-subj並帶上標題信息就能夠了

openssl req -new -x509 -days 365 -key fd.key -out fd.crt \ -subj "/C=GB/L=London/O=Feisty Duck Ltd/CN=www.feistyduck.com"

建立對多個主機名有效的證書

默認狀況下, OpenSSL建立的證書只包含一個公用名並且只能設置一個主機名。由於這個限制,即使你有其餘相關聯的站點,也不得不爲每一個站點生成一張單獨的證書。在這種狀況下,使用一張多域名( multidomain)的證書就有意義了。即使你是維護一個站點,也得確保用戶在訪問站點的全部子域名的時候證書是有效的。在實際使用中意味着使用至少兩個名稱,一個是使用www開頭的,一個是沒有任何前綴的(例如www.feistyduck.com和feistyduck.com)。

有兩種方式在一張證書裏面支持多主機名。一種方式是在X.509的使用者可選名稱( subjectalternative name, SAN)擴展字段裏面列出全部要使用的主機名;另一種就是使用泛域名。能夠將兩種方式合在一塊兒,這樣更加方便。在實際使用的時候,能夠設置頂級域名和一個泛域名來囊括全部二級域名(例如feistyduck.com和*.feistyduck.com)。

當證書包括可選名稱的時候,全部公用名就會被忽略。 CA新建立的證書甚至可能再也不包括任何公用名,因此,請在可選名稱列表中包含全部想要的主機名。

首先,將擴展信息放在一個單獨的文本文件中,我將該文件命名爲fd.ext。在這個文件中,指定擴展的名稱( subjectAltName),而且像下面這樣列出須要的主機名:

subjectAltName = DNS:*.feistyduck.com, DNS:feistyduck.com而後當使用x509命令簽發證書的時候,使用-extfile開關引用該文件:

而後當使用x509命令簽發證書的時候,使用-extfile開關引用該文件:

$ openssl x509 -req -days 365 \ -in fd.csr -signkey fd.key -out fd.crt \ -extfile fd.ext

剩下的步驟與以前的同樣,固然在檢查證書的時候你會發現它包括了SAN擴展信息:

X509v3 extensions: X509v3 Subject Alternative Name: DNS:*.feistyduck.com, DNS:feistyduck.com

檢查證書

第一眼看到證書內容的時候會以爲它們就是一堆隨機數據,而你只須要知道如何解析它們,就會發現其實裏面包含了不少信息。 x509命令能夠幫助你查看剛生成的自簽名證書。下面的例子中我使用-text來打印證書內容,使用-noout則不打印編碼後的證書內容,這樣能夠減小信息干擾(默認狀況下會打印):

root@ubuntu:/usr# openssl x509 -text -in fd.crt -noout Certificate: Data: Version: 1 (0x0) Serial Number: 11154907835031696390 (0x9ace319321493406) Signature Algorithm: sha256WithRSAEncryption Issuer: C=cn, ST=JPprovince, L=JiNan, O=jpconpany, OU=jpsection, CN=jpserver.test.com/emailAddress=xdyixia@163.com Validity Not Before: Oct 15 08:37:40 2019 GMT Not After : Oct 14 08:37:40 2020 GMT Subject: C=cn, ST=JPprovince, L=JiNan, O=jpconpany, OU=jpsection, CN=jpserver.test.com/emailAddress=xdyixia@163.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b3:02:c2:68:7a:bd:b3:11:47:98:d9:25:e1:21: d8:16:84:aa:e7:23:85:aa:f9:38:8f:e2:7f:d1:b5: 2f:76:c8:5a:d9:75:f9:6c:d2:54:dd:e0:b2:be:3c: f6:eb:9b:0e:3d:b6:37:eb:02:d1:44:09:09:40:f8: 4d:5d:1d:41:1d:53:79:dc:b1:55:2e:e7:8b:0a:62: b7:07:2e:55:ef:fc:92:96:6a:ef:3c:27:0a:74:17: 8e:57:b7:79:d5:83:5f:cc:53:a9:e6:b9:8a:fa:00: 23:b9:ec:78:e2:a3:69:81:ac:28:3e:06:cb:92:05: db:35:7b:00:b3:fc:52:da:2a:17:1c:14:67:67:ad: 1f:d4:e2:80:51:9f:40:4c:b8:a7:3e:9a:8b:2e:f8: 5c:a7:dd:73:55:84:c7:4d:9b:eb:24:0a:c7:b6:b0: 57:fc:96:a2:9a:81:14:18:dc:20:db:8b:d1:31:e1: 5d:01:78:23:cb:20:1d:c2:a4:fc:bd:da:b2:16:fc: 63:22:b9:31:d1:50:21:78:07:b6:91:9e:47:10:de: 80:3d:d4:8e:bb:cb:d0:ca:ba:8e:7b:6d:ba:3c:b5: 9a:af:49:96:8a:6f:72:bc:cc:a8:73:07:1f:8e:d3: 77:99:98:72:9e:35:eb:01:70:ee:f5:75:33:e9:ff: e3:e5 Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption 3a:b5:8b:23:1a:2a:bf:a3:0c:27:04:18:54:d7:6f:cc:78:4a: 55:55:c5:4f:70:6d:79:6b:3e:72:d4:54:0f:18:9f:e5:33:34: 8a:ca:d8:cd:15:0d:ba:48:b8:0d:04:ca:30:e5:5d:58:52:14: f8:e4:9e:8b:cd:19:c8:e2:b2:1c:67:d9:43:8a:d2:1e:7b:9a: 0a:29:d5:c2:9f:2e:78:c0:df:62:26:a9:cd:0a:92:c4:b7:12: 70:a6:21:e7:15:98:d3:5a:f4:be:47:eb:ec:78:b8:6c:39:68: 49:49:2b:dc:a9:ae:f9:de:88:91:e6:32:b8:a8:07:82:50:56: 2e:db:25:d6:6b:5f:ee:39:9b:d0:2f:7f:c6:5c:f8:4c:92:7e: b1:3a:11:0c:1e:bf:6c:ba:af:19:23:85:8e:bf:e1:2b:9e:ff: 7e:75:e0:24:ec:91:72:0d:1e:f7:6f:55:e6:66:b1:ef:2a:2b: e5:dc:91:ab:45:aa:ad:bf:48:a2:d7:5e:41:d0:a7:bf:a6:70: 88:07:bb:5d:7e:0a:13:44:58:f5:73:41:a2:2d:ee:5c:80:48: a7:1c:44:7a:75:47:48:25:86:53:7d:f4:c0:8c:7c:f2:6d:af: 1c:d9:13:d2:d1:e4:ef:04:0c:9b:b5:37:58:47:6f:a0:7d:c2: 1e:4f:81:c9
View Code

就像上面的例子同樣,自簽名證書通常只包括最基本的證書數據。相比而言,公共CA簽發的證書則含有更多有意義的信息(經過X.509擴展機制),讓咱們快速瞭解一下。

基本約束( basic constraint)擴展用於標記證書是不是一個CA,這樣的證書能夠給其餘證書進行簽名。非CA證書則沒有這個擴展項或者其中CA的值會被設置爲FALSE。這是一個關鍵擴展,意味着全部軟件必須識別這個字段。

X509v3 Basic Constraints: critical CA:FALSE

密鑰用法( key usage, KU)和擴展密鑰用法( extended key usage, EKU)擴展限制了證書的使用範圍。若是這兩個擴展存在,只有列表裏面的使用方式是容許的。若是這個擴展不存在,則沒有任何限制。你看到的這個例子是很是典型的Web服務器證書,也就是說它不能進行代碼簽名:

X509v3 Key Usage: critical   Digital Signature, Key Encipherment X509v3 Extended Key Usage:   TLS Web Server Authentication, TLS Web Client Authentication

CRL分發點( CRL distribution point)擴展列出了CA證書吊銷列表( certificate revocation list,CRL)的地址,當證書須要被吊銷的時候這個信息很是重要。 CA會對CRL進行簽名,而且每隔一段時間發佈一次(例如, 7天)。

X509v3 CRL Distribution Points: Full Name: URI:http://crl.starfieldtech.com/sfs3-20.crl

證書策略certificate policy)擴展用來指出證書使用哪一種策略簽發,

例如擴展驗證( extendedvalidation, EV)標識就在這裏(證書下面這個例子)。每一個標識都擁有一個惟一的對象標識符( object identifier, OID),對簽發的CA來講它們是惟一的。另外這個擴展通常還包括一個或者多個證書策略聲明( certificate policy statement, CPS),通常都是網頁或者PDF文檔。

509v3 Certificate Policies: Policy: 2.16.840.1.114414.1.7.23.3 CPS: http://certificates.starfieldtech.com/repository/

頒發機構信息訪問( authority information access, AIA)擴展包括了兩個重要信息。首先它列出了CA的在線證書狀態協議( online certificate status protocol, OCSP)響應程序的地址,能夠用來實時監測證書的吊銷狀況。這個擴展可能還帶上這個證書頒發者證書地址也就是證書鏈的上一層證書)。如今服務器證書已經不多直接使用根證書進行簽名了,因此說用戶通常須要在他們的配置裏面加上一個或者多箇中間證書,這時候就很容易出現由於漏了致使證書驗證失敗。有一些客戶端(例如IE)會使用這個信息來獲取中間CA的證書,從而彌補服務器忘記配置中間證書的問題,可是大部分的客戶端不會.

Authority Information Access: OCSP - URI:http://ocsp.starfieldtech.com/ CA Issuers - URI:http://certificates.starfieldtech.com/repository/sf_intermediate.crt

使用者密鑰標識符( subject key identifier)和頒發機構密鑰標識符( authority key identifier) 擴展分別創建了惟一的使用者和頒發機構標識符。證書的頒發機構密鑰標識符擴展的信息必須與 頒發者的使用者密鑰標識符擴展裏面的信息一致。這些信息在證書鏈路徑創建過程當中至關有用 ,客戶端會試圖從分支(服務器)證書開始,尋找到根證書全部可能的路徑。證書機構常常一個私 鑰對應多個證書,而這個字段容許軟件能夠很是可靠地讓證書和密鑰對應起來。現實中不少服務器提供的證書鏈其實都是錯誤的,可是由於瀏覽器能夠自動尋找到其餘可信的路徑,因此這種狀況經常被忽略了。

X509v3 Subject Key Identifier:   4A:AB:1C:C3:D3:4E:F7:5B:2B:59:71:AA:20:63:D6:C9:40:FB:14:F1 X509v3 Authority Key Identifier:   keyid:49:4B:52:27:D1:1B:BC:F2:A1:21:6A:62:7B:51:42:7A:8A:D7:D5:56

最後使用者可選名稱( subject alternative name)擴展用來列出全部合法的主機名。這個擴展是可選的,若是不存在,客戶端就會使用使用者( subject)字段裏面公用名( common name, CN)提供的信息;若是擴展存在,那麼在驗證過程當中CN字段的內容會被忽略。

X509v3 Subject Alternative Name: DNS:www.feistyduck.com, DNS:feistyduck.com

密鑰和證書格式轉換

私鑰和證書能夠以各類格式進行存儲,因此你可能常常須要進行各類格式之間的轉換,最多見的格式以下所示

Binary (DER) certificate 包含原始格式的X.509證書,使用DER ASN.1編碼。 ASCII (PEM) certificate(s) 包含base64編碼過的DER證書,它們以-----BEGIN CERTIFICATE-----開頭,以-----ENDCERTIFICATE-----結尾。雖然有些程序能夠容許多個證書存在一個文件中,可是通常來講一個文件只有一張證書。例如Apache Web服務器要求服務器的證書所有在一個文件裏面,而中間證書一塊兒放在另一個文件中。 Binary (DER) key 包含DER ASN.1編碼後的私鑰的原始格式。 OpenSSL使用他本身傳統的方式建立密鑰( SSLeay)格式。還有另一種不常使用的格式叫做PKCS#8(RFC 5208定義的)。 OpenSSL可使用pkcs8命令進行PKCS#8格式的轉換。 ASCII (PEM) key 包括base64編碼後的DER密鑰和一些元數據信息(例如密碼的保存算法) PKCS#7 certificate(s) RFC 2315定義的一種比較複雜的格式,設計的目的是用於簽名和加密數據的傳輸。通常常見的是.p7b和.p7c擴展名的文件,而且文件裏面能夠包括所需的整個證書鏈。 Java的密鑰管理工具支持這種格式。 PKCS#12 (PFX) key and certificate(s) 一種能夠用來保存服務器私鑰和整個證書鏈的複雜格式,通常以.p12和.pfx擴展名結尾。這類格式常見於Microsoft的產品,可是也用於客戶端證書。雖然好久之前PFX表示PKCS#12以前的版本,如今PFX常被用做PKCS#12的代名詞,不過你已經很難遇到老版本了。
View Code
1. PEM和DER轉換 使用x509工具進行PEM和DER格式之間的證書轉換,從PEM轉換到DER: $ openssl x509 -inform PEM -in fd.pem -outform DER -out fd.der 從DER轉換到PEM: $ openssl x509 -inform DER -in fd.der -outform PEM -out fd.pem 在私鑰的DER和PEM格式之間進行轉換方式是同樣的,可是須要使用rsa或者dsa命令分別用做RSA和DSA密鑰。 2. PKCS#12( PFX)轉換 只須要一個命令就能夠將PEM轉換成PKCS#12。下面的例子將密鑰(fd.key)、 證書( fd.crt)以及中間證書( fd-chain.crt)轉換成一個PKCS#12文件: $ openssl pkcs12 -export \ -name "My Certificate" \ -out fd.p12 \ -inkey fd.key \ -in fd.crt \ -certfile fd-chain.crt Enter Export Password: **************** Verifying - Enter Export Password: **************** 3. PKCS#7轉換 使用crl2pkcs7命令將PEM轉換成PKCS#7格式: $ openssl crl2pkcs7 -nocrl -out fd.p7b -certfile fd.crt -certfile fd-chain.crt 將pkcs7命令與-print_certs開關一塊兒使用能夠將PKCS#7轉換成PEM格式: openssl pkcs7 -in fd.p7b -print_certs -out fd.pem 與PKCS#12同樣,你還得手動編輯fd.pem文件而且將其分紅不一樣部分。

 

內容摘自《OpenSSL攻略》

根據該書進行的實驗並截圖 

相關文章
相關標籤/搜索