OpenSSL

在電腦網路上，**OpenSSL** 是一個開放原始碼的軟體函式庫套件，應用程式可以使用這個套件來進行安全通訊，避免竊聽，同時確認另一端連線者的身分。這個套件廣泛被應用在網際網路的網頁伺服器上。

其主要函式庫是以 C 語言所寫成，實作了基本的加密功能，實作了 SSL 與 TLS 協定。OpenSSL 可以運行在 OpenVMS、 Microsoft Windows 以及絕大多數類 Unix 作業系統上（包括 Solaris，Linux，Mac OS X 與各種版本的開放原始碼 BSD 作業系統）。

雖然此軟體是開放原始碼的，但其授權書條款與 GPL 有衝突之處，故 GPL 軟體使用 OpenSSL 時（如 Wget）必須對 OpenSSL 給予例外。

## 歷史

OpenSSL 計劃在 1998 年開始，其目標是發明一套自由的加密工具，在網際網路上使用。OpenSSL 以 Eric Young 以及 Tim Hudson 兩人開發的 SSLeay 為基礎，隨著兩人前往 RSA 公司任職，SSLeay 在 1998 年 12 月停止開發。因此在 1998 年 12 月，社群另外分支出 OpenSSL，繼續開發下去。

OpenSSL 管理委員會目前由 7 人組成，有 13 個開發人員具有提交權限（其中許多人也是 OpenSSL 管理委員會的一部分）。只有兩名全職員工（研究員），其餘的是志願者。

該項目每年的預算不到 100 萬美元，主要依靠捐款。 TLS 1.3 的開發由 Akamai 贊助。

## 主要版本釋出

## 演算法

OpenSSL 支援許多不同的加密演算法：

**加密**
: 

　
: AES、Blowfish、Camellia、Chacha20、Poly1305、SEED、CAST-128、DES、IDEA、RC2、RC4、RC5、TDES、GOST 28147-89、SM4

**密碼雜湊函式**
: 

　
: MD5、MD4、MD2、SHA-1、SHA-2、SHA-3、RIPEMD-160、MDC-2、GOST R 34.11-94、BLAKE2、Whirlpool、SM3

**公開金鑰加密**
: 

　
: RSA、DSA、ECDSA、ECDHE、迪菲 - 赫爾曼密鑰交換、橢圓曲線密碼學、X25519、Ed25519、X448、Ed448、GOST R 34.10-2001、SM2

（從 1.0 版開始，橢圓曲線迪菲 - 赫爾曼金鑰交換用於支援前向安全性）)

## 功能

1. 建立私鑰：`openssl genrsa -out yourdomain.key 2048` 產生一個 pem 格式的 rsa 非對稱加密演算法的 2048 位元長的私鑰檔案 yourdomain.key
2. 檢視私鑰的內容：`openssl rsa -text -in yourdomain.key -noout`
3. 抽取出公鑰：`openssl rsa -in yourdomain.key -pubout -out yourdomain_public.key`
4. 建立憑證簽章請求檔案（certificate signing request，CSR)：`openssl req -new -key yourdomain.key -out yourdomain.csr`，這時需要線上回答一系列問題（也可以事先寫在設定檔中）。其中 Common Name 應該填寫完整的域名（fully-qualified domain name，FQDN)，如 www.example.com
5. 驗證憑證簽章請求檔案的內容：`openssl req -text -in yourdomain.csr -noout -verify`
6. 驗證收到的憑證檔案：`openssl x509 -text -in yourdomain.crt -noout`
7. 比較公鑰是同一個：`openssl pkey -pubout -in .\private.key | openssl sha256`、 `openssl req -pubkey -in .\request.csr -noout | openssl sha256`、 `openssl x509 -pubkey -in .\certificate.crt -noout | openssl sha256`
8. 把 PEM 格式的 key 與 certificate 轉化為 PKCS#12 格式：`openssl pkcs12 -export -name "yourdomain-digicert-(expiration date)" -out yourdomain.pfx -inkey yourdomain.key -in yourdomain.crt` 注意，PKCS#12 格式儲存了憑證和私鑰，適用於從一個系統遷移到另一個系統。PKCS#12 檔案通常為.pfx 或.p12 副檔名。建議使用強 password 加密。
9. PKCS#12 到 PEM 轉化：`openssl pkcs12 -in yourdomain.pfx -nocerts -out yourdomain.key -nodes`、`openssl pkcs12 -in yourdomain.pfx -nokeys -clcerts -out yourdomain.crt`
10. PEM 到 DER 轉化：`openssl x509 -inform PEM -in yourdomain.crt -outform DER -out yourdomain.der`、`openssl rsa -inform PEM -in yourdomain.key -outform DER -out yourdomain_key.der`
11. DER to PEM：`openssl x509 -inform DER -in yourdomain.der -outform PEM -out yourdomain.crt`、`openssl x509 -inform DER -in yourdomain.der -outform PEM -out yourdomain.crt`

## 心臟出血漏洞

OpenSSL 1.0.1 版本（不含 1.0.1g）含有一個嚴重漏洞，可允許攻擊者讀取伺服器的記憶體資訊。該漏洞於 2014 年 4 月被公諸於世，影響三分之二的活躍網站。

## 分支

### Agglomerated SSL

在 2009 年，OpenSSL API 受挫之後，當時的 OpenBSD 開發人員 Marco Peereboom 建立了分支 Agglomerated SSL（assl），它重新使用 OpenSSL API，但提供了更簡單的外部介面。

### LibreSSL

2014 年 4 月的心臟出血漏洞事件之後，OpenBSD 專案成員以 OpenSSL 1.0.1g 作為分支，建立一個名為 LibreSSL 的專案。在縮減 OpenSSL 的代碼庫的第一周，將超過 90,000 行的 C 語言代碼從分支中刪除。

### BoringSSL

2014 年 6 月，Google 釋出了自己的 OpenSSL 分支 BoringSSL，計劃與 OpenSSL 和 LibreSSL 的開發者合作。

### GmSSL

GmSSL 支援 SM2/SM3/SM4/SM9/ZUC 等商用密碼，主要使用 SM2 替代 RSA/Diffie-Hellman/ECDSA/ECDH，SM3 替代 MD5/SHA-1/SHA-256，SM4 替代 DES/AES，SM9 替代 PKI/CA 體系，所有代碼在 GitHub 上開源，並由北京大學資訊安全實驗室開發和維護。此專案獲得 2015 年度中國 Linux 軟體大賽二等獎（一等獎空缺）。

## 參見

* 加密
* OpenSSH
* TLS 的應用對比
* WolfSSL

## 註記

## 參考

## 外部連結

* OpenSSL 官方網站
* SSLeay 檔案庫
* OpenSSL License vs GPL（頁面存檔備份，存於網際網路檔案館）
* wget's readme file，including the GPL with exception
* mICQ COPYING file，citing the GPL and including the exception
* OpenSSL FAQ entry on interaction between the OpenSSL and GNU licenses（頁面存檔備份，存於網際網路檔案館）
* OpenSSL Quick Reference Guide （頁面存檔備份，存於網際網路檔案館）
* OpenSSL Cookbook - A Short Guide to the Most Frequently Used OpenSSL Features and Commands By Ivan Ristić （頁面存檔備份，存於網際網路檔案館）