OpenSSL gen RSA-out ca . key 1024
(我們這裏不用des3加密。可以添加壹個-des3參數加密,詳情請參考man genrsa)
OpenSSL req-new-x509-days 36500-key ca . key-out ca . CRT
(這壹步需要在提示處輸入很多信息,包括國家代碼、省份、城市、公司名稱等。)
生成服務器端私鑰:
OpenSSL gen RSA-out server . key 1024
在服務器端生成req文件(這壹步生成的req文件包含公鑰證書,加上身份信息,如國家、省、公司等。提交給ca,讓ca簽名):
OpenSSL req-新密鑰服務器
用CA的私鑰對服務器的req文件進行簽名,得到服務器的證書:
OpenSSL x509-req-days 3650-in server . CSR-CA CA . CRT-CAkey CA . key-cacreate serial-out server . CRT
(註意:如果第壹次使用openssl,報告找不到某些相關文件,可能需要先執行兩個命令:touch /etc/pki/CA/index.txt和echo ' 01 ' >/etc/PKI/CA/serial)
上面得到的server.crt就是服務器的證書文件。(有很多軟件需要不同的證書存儲格式,可能需要各種轉換。比如PEM,P12等。,我們還需要在我們的場景中進行壹點點轉換,這將在下面描述。剛開始做這個的同學可能會覺得證書和格式很混亂。這時候妳能做的就是靜下心來,耐心了解TLS,RSA等的原理。,多看看openssl的man文檔。
我不知道把ca.crt稱為ca的證書文件是否合適,但是可以肯定的是,客戶端可以通過使用ca.crt來驗證服務器的身份,服務器在SSL/TLS握手過程中會頒發自己的證書,這個證書是CA簽名的。ca在簽名時使用自己的私鑰,而ca.crt包含CA的公鑰,可以用來檢查這個簽名,確認是否是自己簽名的。
服務器需要使用的文件有:服務器私鑰和服務器證書。
客戶端需要使用的文件是:ca文件(CA證書,用於驗證服務器頒發的證書)。
我們的服務器使用java,使用p12(PKCS12)格式的證書。Openssl可用於格式轉換:
OpenSSL pkcs 12-export-clcerts-in server . CRT-in key server . key-out server . p 12
可以看到輸出server.p12應該包含server.key和server.crt的內容。
我們的C語言客戶端直接使用CA文件:ca.crt .
我們還用java寫了客戶端,java使用CA文件格式為jks。那麽可能需要壹個轉換,這裏用到了java的bin目錄下的keytool:
keytool-import cert-alias CA-file CA . CRT-keystore CA . jks
轉換需要密碼。這樣,ca.crt就轉換成了ca.jks格式。
下面附上socket服務器和java客戶端的部分代碼。c的就不貼了,用matrixssl。
Java服務器(mina)代碼片段:
string file = "/file/path/server . p 12 ";
string key type = " pkcs 12 ";char[] password = "passwd "。toCharArray();
KeyStore ks = KeyStore . getinstance(key type);
ks.load(新文件輸入流(文件),密碼);
KeyManagerFactory kmf = KeyManagerFactory . getinstance(
key manager factory . get default algorithm());
kmf.init(ks,密碼);
SSL context CTX = SSL context . getinstance(" TLS ");
CTX . init(kmf . getkey manager()、null、null);
SslFilter sslFilter =新SSL filter(CTX);只要把這個過濾器加到米娜的aeptor上。
aeptor.getFilterChain()。addLast("ssl ",new SSL filter(createsl context()));
Java客戶端(mina)代碼片段:truststringfile = "/data/tmp/ca . jks ";
String keyType = " jkschar[] password = "123456 "。toCharArray();
KeyStore ks = KeyStore . getinstance(key type);
ks.load(新文件輸入流(文件),密碼);
信任管理工廠tmf =信任管理工廠
。getInstance(trustmanagerfactory . getdefaultalgorithm());
tmf . init(ks);
SSL context SSL context = SSL context . getinstance(" TLS ");
sslContext.init(null,tmf.getTrustManagers(),null);
SslFilter sslFilter =新SSL filter(SSL context);
SSL filter . setuseclientmode(true);服務器是addLast,但這是addFirst。這個順序不會錯。
connector.getFilterChain()。addFirst("sslFilter ",SSL filter);
自己生成的ssl證書和購買的ssl證書有什麽區別?1.自生成的ssl證書是未經驗證的非法SSL證書。購買的SSL證書是WoSign CA等CA機構頒發的SSL證書,CA機構必須通過國際webtrust認證和電子發行法。
2.瀏覽器不信任自己生成的SSL證書,會阻止訪問;購買的SSL證書被瀏覽器信任,顯示綠色安全鎖;
3.自生成的SSL證書容易被偽造和假冒,容易被中間人攻擊,不安全。購買的SSL證書更加安全可信。
例如:
自生成的SSL證書,就像自制的身份證壹樣,沒有任何人認可,沒有機構的認可,無法通過。
購買的SSL證書,就像公安局頒發的身份證壹樣,全球認可,購物、刷卡、住宿都順利通過。如果妳違反紀律,公安局可以找到妳的身份證吊銷或標記。