IIS8中使用OpenSSL來建立CA而且簽發SSL證書

前言

【轉載】http://alvinhu.com/blog/2013/06/12/creating-a-certificate-authority-and-signing-the-ssl-certificates-using-openssl-in-iis8/html

最近在爲新的iOS app考慮安全機制,第一個進入腦海裏的就是HTTPS和SSL。因此研究了一下Windows服務器下IIS部署HTTPS和證書的方法,以及如何讓app與server進行安全的信息交互。ios

因爲網上千篇一概的只是教你們怎麼怎麼操做,並無告訴你們爲何這麼操做。而做爲一個喜歡打破砂鍋問到底的強迫症患者,本身又花了一些時間研究了各個步驟及參數的原理,在這裏把這些小小的理解及經驗記錄下來,即給有一樣需求的同行們作個參考,也給將來的本身留做備份。web

歡迎轉載,轉載請保留原文地址。算法

申明

本人並不是互聯網安全專家,也不是OpenSSL老手。若是這篇文章對你有用,本人很是高興。若是沒法解決問題,你能夠google其餘更專業的文章,我相信只要花點時間確定可以找到答案。本文中全部步驟都通過本人屢次測試,但不能保證必定正確,在此僅供參考。若有不對之處,歡迎留言探討及指正。瀏覽器

準備

  • Windows 8 + IIS 8
  • 直接下載編譯好的OpenSSL,因爲個人系統是64位的,因此我下的是最新版的Win64 OpenSSL v1.0.1e Light
  • 安裝OpenSSL以前要先裝Visual C++ 2008 SP1 Redistributables,根據系統選擇32位的和64位下載並安裝

開始

第一步:安裝OpenSSL

  1. 儘管咱們已經安裝了Visual C++ 2008 SP1 Redistributables,安裝剛開始仍是會提示未安裝Visual C++ 2008 Redistributables,無論它直接點擊肯定
  2. 一路下一步就能夠了,安裝文件夾我選擇C:\OpenSSL
  3. Copy OpenSSL DLLs to:的地方我選擇The OpenSSL binaries (/bin) directory,我不喜歡把什麼DLL都往Windows目錄丟,這樣放在應用程序目錄下比較乾淨
  4. 完成安裝

第二步:配置OpenSSL

一、將路徑C:\OpenSSL\bin\添加到系統路徑中(控制面板 > 系統與安全 > 系統 > 高級系統設置 > 環境變量 > 系統變量 > Path),這樣在任何路徑中都能運行OpenSSL命令安全

二、打開openssl.cfg,修改一下配置:服務器

dir = . # 存放CA文件的文件夾,裏面還須要手動創建子文件夾及件,後面會提到
default_days = 10950 # 證書有效期,設30年比較省心
policy = policy_anything # CA資料和證書申請資料的匹配策略改成這個比較方便
countryName_default = CN # 默認國家
stateOrProvinceName_default = Jiagxi # 默認省份
localityName_default = Nanchang # 默認城市,在localityName = Locality Name (eg,city)下增長這一條
0.organizationName_default = Kashuo # 默認組織

三、接着準備文件夾及文件:網絡

  • 新建文件夾C:\OpenSSL\bin\KashuoCA
  • 新建文件夾C:\OpenSSL\bin\KashuoCA\newcerts
  • 新建文件C:\OpenSSL\bin\KashuoCA\serial(無後綴名),裏面寫入01,用來存放簽發證書流水號
  • 新建空文件C:\OpenSSL\bin\KashuoCA\index.txt,用來存放簽發證書記錄

四、爲了省去每次運行命令都要指定openssl.cfg的麻煩,打開命令提示符(cmd.exe),將cfg文件設爲系統變量:app

1
set OPENSSL_CONF=C:\OpenSSL\bin\openssl.cfg

五、從新打開命令提示符,進入KashuoCA文件夾:dom

1
cd C:\OpenSSL\bin\KashuoCA

準備好之後開始下面的步驟

第三步:創建CA

命令:

1
openssl req -x509 -newkey rsa:1024 -keyout ca.key -out ca.cer

參數:

req # 用來生成PKCS#10格式的證書申請文件,也能夠生成自簽名的CA根證書
-x509 # 有這個參數就是生成CA根證書,沒有就是生成證書申請文件
-newkey rsa:1024 # 同時生成1024位RSA算法的私鑰
-keyout # CA私鑰
-out # 證書申請文件或CA根證書

因爲咱們以前已經設置了證書有效期和cfg文件的地址,因此在命令裏就不須要重複設置了

運行命令之後會要求輸入私鑰密碼,而且再輸入一次確認密碼。在輸入國家省份等資料的時候直接回車使用以前咱們設置的默認值就能夠了,可是在Organizational Unit NameCommon NameEmail Address三個地方沒有設置默認值,由於這三個資料在CA證書和服務器證書裏是不同的。

C:\OpenSSL\bin\KashuoCA>openssl req -x509 -newkey rsa:1024 -keyout ca.key -out ca.cer
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
...........++++++
.........................++++++
writing new private key to 'ca.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [CN]:
State or Province Name (full name) [Jiangxi]:
Locality Name (eg, city) [Nanchang]:
Organization Name (eg, company) [Kashuo]:
Organizational Unit Name (eg, section) []:KashuoCA
Common Name (e.g. server FQDN or YOUR name) []:KashuoCA
Email Address []:ca@kashuo.com

這時候咱們就有了CA根證書和私鑰了!

第四步:經過IIS生成證書申請文件

因爲本例中證書文件是部署在IIS中,因此經過IIS直接生成證書文件會比較方便。固然第二步中提到了經過OpenSSL的req方法也能夠生成證書申請文件。

一、打開IIS

二、在左側鏈接中選擇服務器

三、在中間主頁裏的IIS中選擇服務器證書

四、在右側操做中選擇建立證書申請

五、在打開的窗口中填入如下信息:

通用名稱:www.kashuo.com
組織:Kashuo
組織單位:KashuoServer
城市/地點:Nanchang
省/市/自治區:Jiangxi
國家/地區:CN

通用名稱裏填寫的域名要與該證書所綁定的網站域名一致,不然用戶在瀏覽網站的時候會提示證書與域名不一致

六、加密服務選擇RSA和1024位

七、最後保存證書申請的文件爲C:\OpenSSL\bin\KashuoCA\certreq.txt

第五步:簽發服務器證書

如今,CA證書文件ca.cer、CA私鑰ca.key、服務器證書申請certreq.txt三個文件都在KashuoCA文件夾下

命令:

1
openssl ca -in certreq.txt -cert ca.cer -keyfile ca.key -out iis.cer

參數:

ca # 主要用來簽發證書申請
-in # 證書申請文件
-cert # CA證書
-keyfile # CA私鑰
-out # 簽發的證書

運行命令之後須要輸入CA的私鑰密碼

C:\OpenSSL\bin\KashuoCA>openssl ca -in certreq.txt -cert ca.cer -keyfile ca.key -out iis.cer
Using configuration from C:\OpenSSL\bin\openssl.cfg
Loading 'screen' into random state - done
Enter pass phrase for ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jun 13 10:32:25 2013 GMT
            Not After : Jun  6 10:32:25 2043 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Jiangxi
            localityName              = Nanchang
            organizationName          = Kashuo
            organizationalUnitName    = KashuoServer
            commonName                = www.kashuo.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                E0:8A:69:4A:D1:0A:98:26:EA:AE:AF:5E:6D:A7:A7:C4:DE:07:13:DF
            X509v3 Authority Key Identifier:
                keyid:37:48:69:62:0E:FD:FB:1E:83:EB:DE:2D:0D:F6:55:C1:E1:76:EF:BA

Certificate is to be certified until Jun  6 10:32:25 2043 GMT (10950 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

最後咱們獲得了服務器證書iis.cer

第六步:在服務器上導入CA根證書

因爲第三步生成的CA根證書是自簽名的,並不是由系統能夠識別的第三方信任機構簽發,因此須要將CA根證書導入到服務器中。

  1. 雙擊ca.cer打開證書詳情
  2. 點擊安裝證書打開證書導入嚮導
  3. 存儲位置選擇本地計算機而後下一步
  4. 選擇將全部的證書都放入下列存儲
  5. 點擊瀏覽,選擇受信任的根證據頒發機構
  6. 導入完成

第七步:完成IIS證書申請

如今能夠將第五步生成的iis.cer導入到IIS中了:

  1. 點擊第四步建立證書申請下方的完成證書申請
  2. 選擇證書文件:C:\OpenSSL\bin\KashuoCA\iis.cer
  3. 輸入一個好記名稱,如www.kashuo.com
  4. 證書存儲默認我的
  5. 點擊肯定完成證書導入

這個時候在服務器證書列表裏就能夠看到這個證書了。

第八步:打開網站的SSL設置

安裝好IIS證書之後就能夠打開網站的SSL設置了:

  1. 在IIS左側鏈接中選擇網站
  2. 在右側操做中點擊綁定
  3. 在打開的網站綁定中添加一條記錄:
    • 類型選擇https
    • 主機名填寫綁定的域名,如www.kashuo.com
    • 證書就選擇咱們剛剛添加的證書
    • 肯定完成
  4. 而後在中間主頁裏的IIS中選擇SSL設置,這裏根據本身的需求進行設置
    • 要求SSL:勾選之後只能經過https訪問,不然http和https均可以訪問
    • 客戶證書
      • 忽略:不論客戶端有沒有證書都不檢驗
      • 接受:若是客戶端沒有證書就不檢驗,不然彈出提示框讓用戶選擇證書並檢驗證書合法性
      • 必需:客戶端必需提供合法證書才能進行訪問
  5. 設置完成之後點擊右邊應用就能夠了

對於單向認證SSL鏈接,在客戶證書裏選擇忽略就能夠,教程到這裏也就結束了。客戶端在訪問https地址的時候會收到一個提示,即服務器證書並不是由信任的第三方證書頒發機構頒發,客戶端選擇繼續或者保存爲信任的證書就能夠繼續訪問了。

若是對於安全性要求很高的網站,須要使用雙向認證SSL鏈接,在客戶證書裏就要選擇必需,即服務端和客戶端互相驗證對方證書的合法性。那就還須要爲客戶端生成一個服務端承認的證書。

第九步:生成客戶端證書申請文件

命令:

1
openssl req -newkey rsa:1024 -keyout client.key -out client.csr

參數:

req # 用來生成PKCS#10格式的證書申請文件,也能夠生成自簽名的CA根證書
-newkey rsa:1024 # 同時生成1024位RSA算法的私鑰
-keyout # 證書私鑰
-out # 證書申請文件

細心的你可能發現這個命令和第三步創建CA的命令差很少,區別是少了-x509參數和輸出的是證書申請文件。 運行命令之後輸入兩次客戶端私鑰密碼,而後就是客戶端的一些基本信息。最後的A challenge passwordAn optional company name不是必填的,我就直接回車跳過了。

C:\OpenSSL\bin\KashuoCA>openssl req -newkey rsa:1024 -keyout client.key -out client.csr
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
........++++++
...++++++
writing new private key to 'client.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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) [CN]:
State or Province Name (full name) [Jiangxi]:
Locality Name (eg, city) [Nanchang]:
Organization Name (eg, company) [Kashuo]:
Organizational Unit Name (eg, section) []:KashuoApp
Common Name (e.g. server FQDN or YOUR name) []:Client
Email Address []:client@kashuo.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

第十步:簽發客戶端證書

命令:

1
openssl ca -in client.csr -cert ca.cer -keyfile ca.key -out client.cer

參數:

ca # 主要用來簽發證書申請
-in # 證書申請文件
-cert # CA證書
-keyfile # CA私鑰
-out # 簽發的證書

簽發客戶端證書和簽發服務器證書的命令是同樣的。運行命令之後一樣須要輸入CA的私鑰密碼

C:\OpenSSL\bin\KashuoCA>openssl ca -in client.csr -cert ca.cer -keyfile ca.key -out client.cer
Using configuration from C:\OpenSSL\bin\openssl.cfg
Loading 'screen' into random state - done
Enter pass phrase for ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Jun 20 14:03:18 2013 GMT
            Not After : Jun 13 14:03:18 2043 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Jiangxi
            localityName              = Nanchang
            organizationName          = Kashuo
            organizationalUnitName    = KashuoApp
            commonName                = Client
            emailAddress              = client@kashuo.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                44:C7:B1:DA:5E:36:34:8C:6F:37:17:82:BB:F2:CD:AC:69:1A:3F:41
            X509v3 Authority Key Identifier:
                keyid:FE:79:C3:FF:9E:4F:AA:AA:8F:BD:03:19:1A:02:CD:60:27:FB:98:67

Certificate is to be certified until Jun 13 14:03:18 2043 GMT (10950 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

client.cer就是客戶端證書了

第十一步:將客戶端證書轉換爲PKCS#12格式

命令:

1
openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12

參數:

pkcs12 # 生成或解析PKCS#12證書
-export # 生成證書
-clcerts # 輸出客戶端證書
-in # 原證書
-inkey # 私鑰
-out # 轉換後證書

先輸入客戶端證書私鑰密碼,而後輸入兩次p12文件的導出密碼

C:\OpenSSL\bin\KashuoCA>openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12
Loading 'screen' into random state - done
Enter pass phrase for client.key:
Enter Export Password:
Verifying - Enter Export Password:

client.p12包含客戶端證書和私鑰,支持瀏覽器直接導入,最後一步就是導入p12證書了。

第十二步:導入客戶端證書

在客戶端電腦導入客戶端證書以前須要先導入CA根證書,將第三步生成的CA根證書文件拷貝到客戶端電腦裏,按照第六步的流程導入CA根證書。

接着安裝客戶端證書,這個就比較簡單了:

  1. 雙擊client.p12打開證書詳情
  2. 存儲位置默認當前用戶
  3. 輸入p12文件的導出密碼
  4. 根據我的須要勾選是否可導出密鑰
  5. 自動選擇證書存儲就能夠
  6. 大功告成!

當導入客戶端完成之後,客戶端與服務器的雙向認證SSL就搞定了!

補充:

更多轉換方式見:http://blog.csdn.net/linda1000/article/details/8676330

PEM編碼證書轉換爲DER編碼證書

命令:

1
openssl x509 -outform der -in iis.cer -out iisder.cer

參數:

x509 # x509證書管理
-outform der # 轉換爲DER編碼
-in # 原證書
-out # 轉換後證書

目前我在iOS開發中使用了AFNetworking,在作SSL Pinning的時候讀取服務器證書要求證書編碼爲DER,而第五步生成的證書編碼爲PEM,因此須要用這個命令轉換一下。

關於SSL Pinning能夠查看我另外一片文章:經過SSL Pinning提升iOS應用的安全性

總結

經過此次的CA安裝和簽發證書的學習,弄清了經過SSL提升網絡請求安全性的基本原理,也明白了證書究竟是個什麼東西。其實只要有心,沒有什麼是深不可測的。

固然自簽名CA根證書只是一個臨時解決方案,也是學習概念和理論的好途徑,若是在大型應用而且不差錢話仍是去可信任的CA機構購買證書吧!全文完!

References

相關文章
相關標籤/搜索