# openSSL 自發憑證
## 簡介
`以下範例中,A為傳送資料的人,B為接收資料的人,C為試圖攔截資料的人`
* 對稱式加密(Symmetric Encryption):傳送方與接收方使用同一把金鑰,傳送時使用這把密鑰加密,接收時使用這把密鑰解密。
:mega: 優點:計算量小,因此加密速度快
:mega: 缺點:當金鑰被知道後,其他人便可以透過金鑰輕鬆破譯加密訊息
**<流程>**
1. `傳送者A(server)`與`接收者B(browser)`先進行金鑰的握手(Handshake),讓雙方知道金鑰
2. A將要傳資料的明文用金鑰加密
3. B將收到的密文用金鑰解密

* 非對稱式加密(Asymmetric Encryption):每個使用者都擁有一份私鑰(Private key)、公鑰(Public key)。私鑰本人自行留存,公鑰公開發布發給其他人,私鑰、公鑰皆可以加密或解密。當A傳送檔案給B時,A先獲得B發布的公鑰將檔案加密,傳送給B後B再用私鑰解密,即使中間被C竊取道檔案,沒有B的私鑰也無法閱讀。(當A將檔案加密後,若原檔案遺失,沒有B的私鑰,A也無法透過密文得知原文)
**<流程>**
1. A先使用B的公鑰將要傳送的明文加密
2. B獲得密文後使用自己的私鑰解密
3. 同時為確保傳送者身分不是假冒的,A要將數位簽章用自己的私鑰加密發給B
4. B收到加密的數位簽章後用A的公鑰解密

* ssl安全協議(Secure Socket Layer):
讓web application能夠加密傳輸。
測試時可使用自簽憑證,若是要等第三方簽發有效憑證,很耗時。
主要功能:
* 加密解密在網路中傳輸的資料包,同時保護這些資料不被修改和偽造。
* 驗證網路對話中雙方的身份。
* 數位憑證認證機構CA(Certificate Authority):權威單位發給A(個人或組織)一對公鑰和私鑰,並對外宣稱此公鑰確實代表A本人。CA除了負責發行數位憑證外,也需隨時提供使用者查詢數位憑證真偽的責任。
* 數位簽章(Digital Signature):當A透過自己發布的公鑰傳送檔案給B,B要如何判斷檔案真的是A傳過來,而不是C假冒A傳送病毒檔?此時A使用他的私鑰加密數位簽章的明文並傳給B,B透過A發布的公鑰即可解密數位簽章,由於私鑰只由該使用者自己持有,故可以肯定該檔案必定出自於該使用者,主要**用於陌生環境**與陌生人溝通。

* X509:國際標準證書結構

## 數位簽章與驗簽流程(CA 與 需要簽章的server之間)

簽名
1. CA機構對要簽屬的資料(傳送者提供的Data)進行雜湊運算生成**摘要**
2. CA用CA的私鑰將結果加密形成**簽章**
3. 將憑證(憑證有效期限、發行者、公鑰...等資訊)與簽章形成**數位簽章**
驗簽
1. 接收者將數位簽證中資料進行雜湊運算得雜湊值H
2. 簽章用CA的公鑰解密後得雜湊值H'
3. 若H=H',表示此數位簽證有效
## ssl常用語法
* `genrsa`:生成RSA私鑰
```
usage: genrsa [args] [numbits] #第一個是選項參數
第二個是生成金鑰長度,預設2048 bits
-out <檔案名稱> #輸出檔案
-des3 #encrypt the generated key with DES in ede cbc mode (168 bit key)
加密私鑰
```
* `rsa`:對密鑰進行管理,如從私鑰提取公鑰、查看密鑰信息
```
usage: rsa [options]
-check #檢測密鑰合法性
-text #列印出私有金鑰的各個組成部分
-noout #不列印出key的編碼版本資訊
-in <檔案名稱> #輸入的檔案
-out <檔案名稱> #輸出檔案
```
```
例 $ openssl rsa -noout -text -in <key檔案名稱> #可以查看key檔案的內容
```
* `req`:CSR 文件的生成、查看、驗證、自簽名等功能
```
usage: req [options] <infile> outfile
-new #生成證書請求
-x509 #生成自簽證書
-key #指定已有密鑰的文件
-newkey #在生成證書請求或者自簽名證書時自動生成密鑰
後方指定rsa:bits 產生rsa密鑰
(與key選項互斥)
-in <檔案名稱> #輸入的.csr憑證請求檔案
-out <檔案名稱> #輸出的.csr憑證請求檔案
-text #印出請求檔中的所有信息(不包含公鑰)
-noout #不要印出CSR檔案的編碼版本資訊
–verify #檢驗請求檔案裡的簽名資訊
```
```
例
$ openssl req -509 -in request.csr -out client.csr -key private.key
#使用private.key 私鑰對request.csr的證書請求文件進行簽名並輸出
```
* `x509`:證書處理功能,顯示憑證的內容,轉換其格式,給CSR簽名......等等
```
-in <檔案名稱> #要查詢檔案名稱
-pubkey #查看證書中的公鑰
-subject #列印出證書擁有者的名字
```
## openssl設定實例(網頁伺服器獲得憑證)
* `rootCA` -- 所有網站憑證的源頭,rootCA自身的憑證就叫根憑證(root certificate)。本次範例為CA伺服器,正式環境為第三方機構,測試時由本機擔任
* `hostCA` -- 本次範例為提供自發簽憑證的CA
* `CSR (Certificate Signing Request)` -- 憑證請求檔,檔名使用域名較好判別。CA要完成簽屬但發送者的私鑰不能交給其他人時,就要透過CSR,內容包括發送者公鑰、關於公司/個人資料的文件。
* `CRT` -- 憑證格式
* `PEM or CRT` -- 中繼憑證(intermediate certificate)格式
1.==產生rootCA私鑰==
```
$ openssl genrsa -des3 -out ca.key 4096
```

----------------------------------------------
2.==用設定檔req.conf及ca.key產rootCA 憑證ca.crt==
```
$ openssl req -x509 -new -nodes -key ca.key -sha256 -days 3000 -out ca.crt -extensions req_ext -config req.conf
```

3.==檢查剛產生的憑證ca.crt==
```
$ openssl x509 -noout -text -in ca.crt
```
4.==host產私鑰host.key==
```
$ openssl genrsa -out host.key 4096
```

5.==host產生憑證申請檔host.csr,要交給CA伺服器產生對應的憑證檔用==
```
$ openssl req -new -key host.key -subj "/C=TW/ST=Taiwan/L=Taipei City/O=BOT/OU=IT/CN=tocp4.bot.com.tw" -sha256 -out host.csr -config req.conf
```
6.==host產生自簽憑證檔host.crt (#這一步給第三方或組織的rootCA執行就不是自簽憑證,而是實際對外網頁服務)==
```
openssl x509 -req -in host.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out host.crt -days 3000 -sha256 -extensions req_ext -extfile req.conf
```

7.==檢查剛產生的憑證host.crt==
```
$ openssl x509 -noout -text -in host.crt
```
#### 參考連結
[基本概念](https://medium.com/@RiverChan/%E5%9F%BA%E7%A4%8E%E5%AF%86%E7%A2%BC%E5%AD%B8-%E5%B0%8D%E7%A8%B1%E5%BC%8F%E8%88%87%E9%9D%9E%E5%B0%8D%E7%A8%B1%E5%BC%8F%E5%8A%A0%E5%AF%86%E6%8A%80%E8%A1%93-de25fd5fa537)
[非對稱式加密wiki](https://zh.wikipedia.org/wiki/%E5%85%AC%E5%BC%80%E5%AF%86%E9%92%A5%E5%8A%A0%E5%AF%86)
[https連線圖解](https://ithelp.ithome.com.tw/articles/10230996)
[數位簽證詳解](http://www.tsnien.idv.tw/Security_WebBook/%E7%AC%AC%E4%B8%83%E7%AB%A0%20%E6%95%B8%E4%BD%8D%E7%B0%BD%E7%AB%A0%E8%88%87%E6%95%B8%E4%BD%8D%E6%86%91%E8%AD%89.html)
[數位簽證詳解(英文)](https://cheapsslsecurity.com/blog/digital-signature-vs-digital-certificate-the-difference-explained/)
[密碼學原理](https://ithelp.ithome.com.tw/articles/10215109)
[常用ssl指令](https://www.sslbuyer.com/index.php?option=com_content&view=article&id=129:openssl-command-intro&catid=25&Itemid=4031)
[ssl命令詳解](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/702759/)
[rsa參數詳解](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/437526/)
[申請ssl過程](https://haway.30cm.gg/ssl-key-csr-crt-pem/)
[根憑證解釋](https://matthung0807.blogspot.com/2021/03/https-what-is-root-certificate.html)