OPENSSL入門

對於openssl來說我已痛苦很久了,始終不得其門而入,雖然可以找到如何建立 key, pem等的相關指令,然而很少提參數的用法,或是長篇大論談密碼學的理論,結果我還是一知半解,尋遍網路也找不到入門的好書,以下是入門的講解觀念(不使用難 懂的字眼),不談演算法,但可 幫助你建 立 觀念,如果要深入請參考其它的資料,我在書局找到的書不多,兩本原文/一本中文,原文openssl(1300左右),SSL and TLS designing and Building Secure Systems(1200元左右),我參考上述書本,及如何製作 SSL X.509 憑證?,及http://en.wikipedia.org/wiki/X.509
本文尚在撰寫中....

Secure Sockets Layer protocol(SSL)有何用處?
你的資料在網路上傳輸安全嗎?可以很直接說不安全,在網路發展之初,所有傳輸協定的封包都是明碼來傳送。而且網路的傳輸都是以接力的方式來層層轉送,因此 資料可以很容易的被攔劫、複製、篡修改。
為了安全的緣故,資料加密開 始被應用在傳輸面,只要在網路傳輸是編碼的狀態下,就可以確保資料不易外洩,而編碼來說一般來說分為兩種:

對稱式加解密法(編碼解碼使用同一個key)
  1. 編碼 key+原始資料->編碼資料
  2. 解碼 key+編碼資料->原始資料
非對稱式加解密法(編碼解碼使用不同的key)
  1. 編碼 key1+原始資料->編碼資料
  2. 解碼 key2+編碼資料->原始資料

因對稱式加解密法使用同一把key,如何把該把key傳到收資料使用者的手堙H對方有你的key會不會偽造你送出資料呢?這接連而來的安全性問題,讓對稱 式加解密法的無法滿足在連線溝通階段, 然而其加解密的速度比較快

非對稱式加解密法的原理
先取得一個private key (public key是可由private key所演算而來的)


原則
1.private key只有你擁有(你要保護它不被別人取得),而public key是可公開在網路上散佈
2.使用任何一個key來加密資料,只能由相對key來解密資料
3.別人傳送資料給你,只有你能解,因為私鑰只有你有

簡單的瀏覽器連線步驟(https)
  1. 瀏覽器使用https向網頁伺服器要求連線
  2. 網頁伺服器傳送certificate給瀏覽器
  3. 瀏覽器檢查certificate
  4. 瀏覽器使用public key加密"隨機產生的對稱式加密key",傳給網頁伺服器
  5. 網頁伺服器使用對稱式key加密要傳送到瀏覽器的資料(因為對稱key運算比較快)
  6. 瀏覽器向網頁伺服器要的資料也使用對稱式key加密

應用實例:
以下參考openssl Certificate cookbook的Introducing SSL and Certificates 一章,用我的語法寫出
Alice要送一封信給它的銀行,要將公司帳號的某一數量的錢匯出到另一個帳號,他不要別人看到他的一些資訊,只有銀行能看到,因此他需要一個編碼的方 法,只有銀行可以看到他的資料,根據這個觀點我們可以使用非對稱式的編碼使用銀行的公鑰來編碼,這樣只有銀行私鑰可以解密該信,但是如何確定信件沒有遭它 人修改?
Message Digests(訊息摘要)
使用一種數學函式,將郵件運算產生一個數值(不同的信件難以產生相同的digest,但仍有可能),這個數值稱為hash或message digest,如果郵件有變更過,則這個數值也會變更,因此可以用來檢查郵件對是否被修改,因此Alice在郵件中加入了digest,然而digest 沒有編碼,則和原來郵件都可以被修改,因此不夠安全?
Digital signatures (數位簽名)
為了確認使用者我們使用另一個機制叫數位簽名,將上述的digest使用自己的私鑰來加密,郵件包含了使用銀行公鑰加密的郵件+使用本人私鑰加密的 digest+本人公鑰,附上公鑰的用意是別人可以解開digest,雖然私鑰只有Alice有,但我仍無法得知確定是alice的?
Certificates(憑證)
現在Alice可以傳送出去私人的郵件到銀行,並簽名,並確定郵件無法被修改,然而Alice要確定它使用的公鑰是真正來自銀行,而銀行也要確定 Alice的公鑰是來自Alice,如果銀行及Alice都有一個憑證證明他們是誰(如身份證),我們透過Certificate Authority(憑證的認證中心),幫我們確認身份

Certificates Req(憑證要求)
 我們要請憑證中心發憑證時,必需有"憑證要求"來向憑證中心要求發,它是一種檔案格式,含有憑證需要的資訊,你需要私鑰來簽發 要求,私鑰是任何

X.509?
衍生自x.500的憑證(這是其中一種憑證而己)
這是包含了一個CA 簽證的憑證及公key的


憑證內容(請記住大概的內容)
憑證有不同的格式(以下是文字格式)
發佈人Issuer
憑證
憑證擁有人的公鑰
日期
簽名(沒有被修改)
(絕不會包含私鑰)

副檔名.crt顯示如下:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 0 (0x0)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=TW, ST=Taiwan, L=Taipei, O=test Shipping co., Ltd., OU=computer , CN=csc /emailAddress=csc@test.com
Validity
Not Before: Mar 9 08:53:36 2005 GMT
Not After : Mar 9 08:53:36 2006 GMT
Subject: C=TW, ST=Taiwan, L=Taipei, O=test Shipping co., Ltd., OU=computer , CN=csc /emailAddress=csc@test.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:ce:cc:79:df:e6:f9:cb:11:4b:18:da:57:87:b2:
0c:6c:61:13:b2:3b:a8:7e:94:fb:8b:b3:5d:91:c5:
d1:52:4f:04:7c:fd:84:15:41:c0:c1:3e:c6:7d:ce:
f6:3a:b5:5b:08:97:70:0d:4c:0b:77:58:82:ba:36:
0d:c5:33:18:c5:55:a4:d2:1d:aa:ff:05:d8:b0:19:
7e:53:1d:21:52:ab:9d:aa:37:25:87:1c:f6:a9:1b:
e8:78:a9:f3:cf:b2:32:c7:15:d6:b7:c3:32:b2:2b:
6a:72:6c:ed:e9:68:ff:27:07:2e:29:12:e1:f1:51:
6f:c9:46:e5:78:54:4f:d2:9d
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
DF:B4:69:03:7C:3A:A3:CA:2E:93:47:AC:55:23:8B:4F:E6:42:19:5F
X509v3 Authority Key Identifier:
keyid:DF:B4:69:03:7C:3A:A3:CA:2E:93:47:AC:55:23:8B:4F:E6:42:19:5F
DirName:/C=TW/ST=Taiwan/L=Taipei/O=test Shipping co., Ltd./OU=computer /CN=csc /emailAddress=csc@ocean-pioneer.com
serial:00

X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: md5WithRSAEncryption
7a:60:d2:c3:2c:a7:5a:77:0e:d8:c8:1f:0e:c4:74:99:9a:59:
f6:f6:f5:cf:e5:4d:96:c9:78:73:b2:46:02:f2:f3:6e:71:fc:
97:f5:76:0d:3a:2e:eb:e3:21:1d:c4:2a:ea:97:18:1d:76:a8:
dd:7f:24:a8:5c:23:34:32:b6:e3:ee:87:6a:a5:80:b3:7a:e5:
fc:70:ec:12:06:a1:4a:34:d4:69:0a:41:9b:0a:19:d7:82:64:
67:ea:3f:e4:2d:58:f1:cf:b7:38:d7:95:7c:7d:67:ae:6f:03:
82:79:1b:ac:7f:0c:bb:1d:1c:a7:f0:ec:fe:90:d7:81:9c:49:
af:53

-----BEGIN CERTIFICATE-----
MIIDxDCCAy2gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBozELMAkGA1UEBhMCVFcx
DzANBgNVBAgTBlRhaXdhbjEPMA0GA1UEBxMGVGFpcGVpMSkwJwYDVQQKEyBPY2Vh
biBQaW9uZWVyIFNoaXBwaW5nIGNvLiwgTHRkLjESMBAGA1UECxMJY29tcHV0ZXIg
MQ0wCwYDVQQDEwRjc2MgMSQwIgYJKoZIhvcNAQkBFhVjc2NAb2NlYW4tcGlvbmVl
ci5jb20wHhcNMDUwMzA5MDg1MzM2WhcNMDYwMzA5MDg1MzM2WjCBozELMAkGA1UE
BhMCVFcxDzANBgNVBAgTBlRhaXdhbjEPMA0GA1UEBxMGVGFpcGVpMSkwJwYDVQQK
EyBPY2VhbiBQaW9uZWVyIFNoaXBwaW5nIGNvLiwgTHRkLjESMBAGA1UECxMJY29t
cHV0ZXIgMQ0wCwYDVQQDEwRjc2MgMSQwIgYJKoZIhvcNAQkBFhVjc2NAb2NlYW4t
cGlvbmVlci5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM7Med/m+csR
SxjaV4eyDGxhE7I7qH6U+4uzXZHF0VJPBHz9hBVBwME+xn3O9jq1WwiXcA1MC3dY
gro2DcUzGMVVpNIdqv8F2LAZflMdIVKrnao3JYcc9qkb6Hip88+yMscV1rfDMrIr
anJs7elo/ycHLikS4fFRb8lG5XhUT9KdAgMBAAGjggEEMIIBADAdBgNVHQ4EFgQU
37RpA3w6o8ouk0esVSOLT+ZCGV8wgdAGA1UdIwSByDCBxYAU37RpA3w6o8ouk0es
VSOLT+ZCGV+hgamkgaYwgaMxCzAJBgNVBAYTAlRXMQ8wDQYDVQQIEwZUYWl3YW4x
DzANBgNVBAcTBlRhaXBlaTEpMCcGA1UEChMgT2NlYW4gUGlvbmVlciBTaGlwcGlu
ZyBjby4sIEx0ZC4xEjAQBgNVBAsTCWNvbXB1dGVyIDENMAsGA1UEAxMEY3NjIDEk
MCIGCSqGSIb3DQEJARYVY3NjQG9jZWFuLXBpb25lZXIuY29tggEAMAwGA1UdEwQF
MAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAemDSwyynWncO2MgfDsR0mZpZ9vb1z+VN
lsl4c7JGAvLzbnH8l/V2DTou6+MhHcQq6pcYHXao3X8kqFwjNDK24+6HaqWAs3rl
/HDsEgahSjTUaQpBmwoZ14JkZ+o/5C1Y8c+3ONeVfH1nrm8DgnkbrH8Mux0cp/Ds
/pDXgZxJr1M=
-----END CERTIFICATE-----
在建立CA時需要輸入的重要參數

1.Common Name
2.Email Address
3.Organizational Unit Name
4.Organization Name
5.Locality name
6.State or Province name
7.Country Name
Issuer是簽證的單位
Subject 是上述資料


憑證的延伸
一般的憑證並不是以純文字的方式出現而是以下面:
.CER-DER編碼的憑證,有時是循序的
.DER-DER編碼的憑證
.PEM-Base64編碼使用-----BEGIN CERTIFICATE-----,和-----END CERTIFICATE-----",
.P7B
.P7C



CA(憑證驗證中心)
由上我們得知憑證是用來取的信任的重要資料,但是如何辨認憑證的真偽呢?
首先我們有幾個最高(root)憑證中心是我們信任
凡是經由其簽證的憑證都是可以信任的,然而憑證是以金字塔型至多兩層的簽證
root ca授權ca可以簽發憑證
而驗證憑證先向CA驗證,如果不認得,只要root CA認得就好
#如果你管理一個網域使用自己的簽證x.509 ,也一樣要自己建立根私鑰,及根憑證,然後可以替自己的主機簽證
#如果由其它的(商業/免費)憑證中心所簽發憑證,你要準備憑證要求給你的憑證中心,在該憑證中心簽證之後會送給你一個憑證證書,當然大部份會由root 憑證中心提供你二個必要的資料私鑰/憑證,但你要提供憑證的相關欄位資訊

由上得知樹狀的間



SSL /TLS
SSL(Secure Sockets Layer)/是Netscape 所發明一的種連線安全的機制,後來產生了新TLS(Transport Layer Security) ,其差別如下:
1.SSL是全程使用,如果原來使用非編碼的連線,若要進入編碼的連線,要由另一個port連線進入
2.TLS是在同一個連線中可以使用啟動TLS的關鍵字進入,同樣可以退出為一般的連線
因此使用ssl的daemon要使用另一個port來等待別人來連線,而tls是使用原來的port

使用SSL協定
https: 443
pop3s:995
imaps:993
使用TLS協定,可在原port交談,不用切換,但程式必須要支援
pop3:110-多了STLS命令
imap:143 -多了STARTTLS命令
smtp:25-多了STARTTLS命令

#版本
SSL 2.0 -基本上已經廢棄了
SSL 3.0 -好像不相容SSL 2.0
TLS 1.0 -和SSL3.0 非常類似
沒有SSL 1.0的版本,而且各版本是不同組織所定的



重點說明
1.redhat的openssl檔案 所在,/usr/share/ssl是其所在目錄
2.私鑰是可以自己產生的(openssl),也可以別人提供,一般使用者
3.憑證要求,在你取得憑證後可以刪除,它唯一的用處是用來要求憑證
4.最重要的兩個資料,私鑰/憑證你要保管好

以上是由私鑰到憑證的順序
1.建立私鑰(private key)
2.建立憑證要求(ca request)
3.CA簽證憑證(ca)

如果你管一個網域
1.建立網域私鑰
2.建立憑證要求



私鑰的大小
512/1024/2048......


openssl命令實作
了解了SSL的觀念之後,以下我們要實作私鑰/憑證要求/x509憑證
私鑰
憑證(自己簽發/別人簽發)
以下介紹如何實作,其實作法沒有一定步驟,有些步驟是可以在併在同一行命令,因此讓人產生困惑,無法得知步驟順序,例如:有的介紹先產生私鑰,再產生憑證 要求,有的將其合併在同一命令,因此。


man genrsa (產生私鑰)
man gendsa (同上)
man req (建立憑證要求/憑證產生工具)
man ca
man x509
上述二個manual比man openssl有更多資料
1.產生私鑰
是使用時間隨機產生,key的長度>64bit,預設是1024,為了安全的緣故使用長的比較好如2048
openssl genrsa -des3
openssl gendsa
你可以使用openssl執行命令一併產生私鑰,使用-keyout


2.產生憑證要求
使用openssl req 命令,可產生 PKCS#10 (Public-Key Cryptography Standards [PKCS]) 憑證要求. 它也會產生一對鑰匙使用 "-new"  至於有效時間則是使用 "-days",openssl會提示你輸入一個密碼給新建的私鑰 , 然後憑證要其它的相關資料:
openssl req -new -keyout newkey.pem -out newreq.pem  -days 360\
-config /usr/share/ssl/openssl.cnf

Generating a 1024 bit RSA private key
..............++++++
.++++++
writing new private key to 'newkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

You are about to be asked to enter information that will be incorperated
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) [DE]:
State or Province Name (full name) []:
Locality Name (eg, city) [Dummsdorf]:
Organization Name (eg, company) [PSEUDONYM.ORG]:
Organizational Unit Name (eg, section) [pseudonym.org]:
Common Name (eg, YOUR name) [www.pseudonym.org]:
Email Address []:hirntod@www.pseudonym.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
憑證要求建立在 newreq.pem (如下,其檔案前後有註解):
Sample Certificate Request
-----BEGIN CERTIFICATE REQUEST-----
MIIBXTCCAQcCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJNQTESMBAGA1UE
...
Aty7AlcmN9XNwxUk1w0H3hk=
-----END CERTIFICATE REQUEST-----
私鑰建立在 newkey.pem檔案中:
Sample Private Key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,21F13B37A796482C

XIY0c7gnv0BpVKkOqXIiqpyONx8xqW67wghzDlKyoOZt9NDcl9wF9jnddODwv9ZU
...
QxS2zwfKG1u+YqS1c2v5ecBgqW78DQLvxMkpYU8+xge7vDeoYKE14w==
-----END RSA PRIVATE KEY-----

Signing the Certificate Request

伺服器的憑證使用 OpenSSL "ca" 命令來簽證,而 "-policy" 用來切換 OpenSSL的環境檔, distinguished name fields 是必要的, 而欄位的順序. 如範例中,我們的環境檔在 "policy_anything"這一節中所有的目的名稱的欄位都不是必要的.

當命令執行時它提示憑證 authority password:

Signing a Certificate Request to Create Server Certificate
cat newreq.pem newkey.pem > new.pem
openssl ca -policy policy_anything -out newcert.pem \
-config /usr/share/ssl/openssl.cnf -infiles new.pem

Enter PEM pass phrase:
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName :PRINTABLE:'DE'
stateOrProvinceName :PRINTABLE:''
localityName :PRINTABLE:'Dummsdorf'
organizationName :PRINTABLE:'PSEUDONYM.ORG'
organizationalUnitName:PRINTABLE:'pseudonym.org'
commonName :PRINTABLE:'www.pseudonym.org'
emailAddress :IA5STRING:'hirntod@www.pseudonym.org'
Certificate is to be certified until May 12 15:39:33 1998 GMT (365 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
The server certificate is created in the file newcert.pem and is as follows (line-breaks added for issuer and subject):
Sample Server Certificate
 issuer :/C=DE/SP=/L=Dummsdorf/O=PSEUDONYM.ORG/OU=pseudonym.org/
CN=www.pseudonym.org CA/Email=hirntod@www.pseudonym.org
subject :/C=DE/SP=/L=Dummsdorf/O=PSEUDONYM.ORG/OU=pseudonym.org/
CN=www.pseudonym.org CA/Email=hirntod@www.pseudonym.org
serial :01

Certificate:
Data:
Version: 0 (0x0)
Serial Number: 1 (0x1)
Signature Algorithm: md5withRSAEncryption
Issuer: C=DE, SP=, L=Dummsdorf, O=PSEUDONYM.ORG,
OU=pseudonym.org,
CN=www CA/Email=hirntod@www.pseudonym.org
Validity
Not Before: May 12 15:39:33 1997 GMT
Not After : May 12 15:39:33 1998 GMT
Subject: C=DE, SP=, L=Dummsdorf, O=PSEUDONYM.ORG,
OU=pseudonym.org,
CN=www.pseudonym.org/Email=hirntod@www.pseudonym.org
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Modulus:
00:a1:41:0b:0c:15:53:a5:a5:c4:37:a8:48:f5:79:
39:9f:18:2d:f4:bf:43:34:36:21:23:03:48:a5:65:
cb:e2:f8:97:af:9c:7d:df:1e:9b:54:e2:ad:21:e3:
41:3e:54:9a:ce:dc:66:4d:61:59:fb:83:11:36:bf:
9c:3b:47:20:fb
Exponent: 65537 (0x10001)
Signature Algorithm: md5withRSAEncryption
63:77:e7:f8:aa:0b:90:5e:13:9e:4b:57:f1:0f:22:f9:4c:e3:
7a:aa:ff:a7:8a:2e:3c:1c:a2:92:07:bc:9f:22:3f:2f:13:3f:
60:62:57:a7:74:12:35:28:82:b1:00:2a:36:54:de:67:cd:a2:
9e:24:3e:98:be:14:4e:35:b7:7f

-----BEGIN CERTIFICATE-----
MIICLTCCAdcCAQEwDQYJKoZIhvcNAQEEBQAwgZ4xCzAJBgNVBAYTAlVTMQswCQYD
...
Ij8vEz9gYlendBI1KIKxACo2VN5nzaKeJD6YvhRONbd/
-----END CERTIFICATE-----

3.產生憑證




4.顯示憑證內容
純文字內容
openssl x509 -in 憑證檔名 -noout -text
顯示serial
openssl x509 -in 憑證檔名 -noout -serial
顯示DN
openssl x509 -in 憑證檔名 -noout -subject
顯示Md5 fingerprint
openssl x509 -in cert.pem -noout -fingerprint
顯示sh1 fingerprint
.

sendmail 使用內建的設定
參考/etc/mail/sendmail.mc內說明
1.cd /usr/share/ssl/certs
2.檢查ca-bundle.crt 是否存在(預設有).sendmail.pem是否存在(預設沒有)
3.make sendmail.pem
4.修改/etc/mail/sendmail.mc,將前面的dnl
define(`confCACERT_PATH',`/usr/share/ssl/certs')
define(`confCACERT',`/usr/share/ssl/certs/ca-bundle.crt')
define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.pem')
define(`confSERVER_KEY',`/usr/share/ssl/certs/sendmail.pem')
5.cd /etc/mail  ,make sendmail.mc >sendmail.cf
6.重新啟動sendmail

測試
1.使用telnet localhost 25
2. ehlo "名稱"
3.檢查回應是否含STARTTLS
4.如果有仍有問題,試著變更sendmail.cf 中的log 將9->15,重複1-3,然後檢查/var/log/maillog