openssl是一個開源程式的套件、這個套件有三個部分組成:一是<code>libcryto</code>,這是一個具有通用功能的加密庫,裡面實作了衆多的加密庫;二是<code>libssl</code>,這個是實作ssl機制的,它是用于實作tls/ssl的功能;三是openssl,是個多功能指令行工具,它可以實作加密解密,甚至還可以當ca來用,可以讓你建立證書、吊銷證書。
預設情況ubuntu和centos上都已安裝好openssl。centos 6.x 上有關ssl證書的目錄結構:
ca要給别人頒發證書,首先自己得有一個作為根證書,我們得在一切工作之前修改好ca的配置檔案、序列号、索引等等。
<code>vi /etc/pki/tls/openssl.cnf</code>:
一定要注意<code>[ policy_match ]</code>中的設定的比對規則,是有可能因為證書使用的工具不一樣,導緻即使設定了csr中看起來有相同的countryname,stateorprovincename等,但在最終生成證書時依然報錯:
<code>touch index.txt serial</code>:
在ca目錄下建立兩個初始檔案:
為了安全起見,修改cakey.pem私鑰檔案權限為600或400,也可以使用子shell生成<code>( umask 077; openssl genrsa -out private/cakey.pem 2048 )</code>,下面不再重複。
使用req指令生成自簽證書:
會提示輸入一些内容,因為是私有的,是以可以随便輸入(之前修改的openssl.cnf會在這裡呈現),最好記住能與後面保持一緻。上面的自簽證書<code>cacert.pem</code>應該生成在<code>/etc/pki/ca</code>下。
以上都是在ca伺服器上做的操作,而且隻需進行一次,現在轉到nginx伺服器上執行:
這裡測試的時候ca中心與要申請證書的伺服器是同一個。
同樣會提示輸入一些内容,其它随便,除了<code>commone name</code>一定要是你要授予證書的伺服器域名或主機名,challenge password不填。
接下來要把上一步生成的證書請求csr檔案,發到ca伺服器上,在ca上執行:
上面簽發過程其實預設使用了<code>-cert cacert.pem -keyfile cakey.pem</code>,這兩個檔案就是前兩步生成的位于<code>/etc/pki/ca</code>下的根密鑰和根證書。将生成的crt證書發回nginx伺服器使用。
到此我們已經擁有了建立ssl安全連接配接所需要的所有檔案,并且伺服器的crt和key都位于配置的目錄下,剩下的是如何使用證書的問題。
浏覽器作為用戶端去通路https加密的伺服器,一般不用去手動做其他設定,如<code>https://www.google.com.hk</code>,這是因為chrome、firefox、safari、ie等浏覽器已經内置了大部分常用的ca的根證書,但自建ca的根證書就不再浏覽器的信任清單中,通路時會提示如下:
ie浏覽器
谷歌浏覽器
安裝網站證書後(同時也有信任的根證書),位址欄一般會顯示綠色小鎖
證書資訊
這一步不是必須的,一般出現在開發測試環境中,而且具體的應用程式應該提供添加證書的方法。
<code>curl</code>工具可以在linux上模拟發送請求,但當它去通路https加密網站時就會提示如下資訊:
提示上面的資訊說明curl在linux的證書信任集裡沒有找到根證書,你可以使用<code>curl --insecure</code>來不驗證證書的可靠性,這隻能保證資料是加密傳輸的但無法保證對方是我們要通路的服務。使用<code>curl --cacert cacert.pem</code>可以手動指定根證書路徑。我們也可以把根證書添加到系統(centos 5,6)預設的bundle:
在nginx配置檔案(可能是<code>/etc/nginx/sites-available/default</code>)的server指令下添加:
同時注意 server_name 與證書申請時的 common name 要相同,打開443端口。當然關于web伺服器加密還有其他配置内容,如隻對部分url加密,對url重定向實作強制https通路,請參考其他資料。
注意,如果對于一般的應用,管理者隻需生成“證書請求”(字尾大多為.csr),它包含你的名字和公鑰,然後把這份請求交給諸如verisign等有ca服務公司(當然,連同幾百美金),你的證書請求經驗證後,ca用它的私鑰簽名,形成正式的證書發還給你。管理者再在web server上導入這個證書就行了。如果你不想花那筆錢,或者想了解一下原理,可以自己做ca。從ca的角度講,你需要ca的私鑰和公鑰。從想要證書的伺服器角度将,需要把伺服器的證書請求交給ca。
如果你要自己做ca,别忘了用戶端需要導入ca的證書(ca的證書是自簽名的,導入它意味着你“信任”這個ca簽署的證書)。而商業ca的一般不用,因為它們已經内置在你的浏覽器中了。