• SSL/TLS协议运行机制


    http://blog.csdn.net/fw0124/article/details/41013333

    关于SSL/TLS/JSSE的介绍:
    1)SSL/TLS协议运行机制
    2)图解SSL/TLS协议
    3)使用wireshark观察SSL/TLS握手过程
    4)SSL/TLS的Java实现--JSSE

    (一)使用keytool创建密钥库

    使用双向认证的SSL/TLS协议通信,客户端和服务器端都要设置用于证实自己身份的安全证书,并且还要设置信任对方的哪些安全证书。
    理论上一共需要准备四个文件,两个keystore文件和两个truststore文件。
    通信双方分别拥有一个keystore和一个truststore,keystore用于存放自己的密钥和公钥,truststore用于存放所有需要信任方的公钥。

    首先使用JDK自带的keytool工具来生成keystore和truststore。这里使用的Java版本是1.7。
    1)创建server的keystore文件,生成server的公钥/私钥密钥对。需要指定keystore的密码(storepass)和密钥对的密码(keypass)。
    访问keystore需要storepass。访问密钥对需要keypass。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">C:Program FilesJavajre7in>keytool -genkey -alias catserver -keyalg rsa -keysize 1024 -sigalg sha256withrsa -keypass catserver -keystore c:\_tmpcatserver.keystore -storepass catserverks  
    2. What is your first and last name?  
    3. [Unknown]: cat  
    4. What is the name of your organizational unit?  
    5. [Unknown]: cat  
    6. What is the name of your organization?  
    7. [Unknown]: cat  
    8. What is the name of your City or Locality?  
    9. [Unknown]: cat  
    10. What is the name of your State or Province?  
    11. [Unknown]: cat  
    12. What is the two-letter country code for this unit?  
    13. [Unknown]: ct  
    14. Is CN=cat, OU=cat, O=cat, L=cat, ST=cat, C=ct correct?  
    15. [no]: y</span>  


    2)创建client的keystore文件。同样需要指定keystore的密码和密钥对的密码。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">C:Program FilesJavajre7in>keytool -genkey -alias foxclient -keyalg dsa -keysize 512 -sigalg sha1withdsa -keypass foxclient -keystore c:\_tmpfoxclient.keystore -storepass foxclientks  
    2. What is your first and last name?  
    3. [Unknown]: fox  
    4. What is the name of your organizational unit?  
    5. [Unknown]: fox  
    6. What is the name of your organization?  
    7. [Unknown]: fox  
    8. What is the name of your City or Locality?  
    9. [Unknown]: fox  
    10. What is the name of your State or Province?  
    11. [Unknown]: fox  
    12. What is the two-letter country code for this unit?  
    13. [Unknown]: fx  
    14. Is CN=fox, OU=fox, O=fox, L=fox, ST=fox, C=fx correct?  
    15. [no]: y</span>  


    3)从server的keystore中导出server的证书(其中包括server的公钥)。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">C:Program FilesJavajre7in>keytool -export -alias catserver -keystore c:\_tmpcatserver.keystore -storepass catserverks -file c:\_tmpcatserver.cer  
    2. Certificate stored in file <c:\_tmpcatserver.cer>  
    3. </span>  

    4)从client的keystore中导出client的证书(其中包括client的公钥)。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">C:Program FilesJavajre7in>keytool -export -alias foxclient -keystore c:\_tmpfoxclient.keystore -storepass foxclientks -file c:\_tmpfoxclient.cer  
    2. Certificate stored in file <c:\_tmpfoxclient.cer>  
    3. </span>  


    5)创建server的truststore文件并导入client的证书(其中包括client的公钥)。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">C:Program FilesJavajre7in>keytool -import -alias foxclient -keystore c:\_tmpcatservertrust.keystore -storepass catservertrustks -file c:\_tmpfoxclient.cer  
    2. Owner: CN=fox, OU=fox, O=fox, L=fox, ST=fox, C=fx  
    3. Issuer: CN=fox, OU=fox, O=fox, L=fox, ST=fox, C=fx  
    4. Serial number: 6eaf996f  
    5. Valid from: Wed Nov 05 16:15:41 CST 2014 until: Tue Feb 03 16:15:41 CST 2015  
    6. Certificate fingerprints:  
    7. MD5: B5:B6:92:66:84:92:A0:C2:F5:40:39:25:F8:66:2A:17  
    8. SHA1: 07:42:A3:1A:49:7B:C9:34:4B:6B:FA:37:6C:20:98:D4:20:13:7C:91  
    9. SHA256: 37:A5:00:A3:13:00:DE:99:3B:08:47:F6:1E:8A:05:F1:4A:B2:C6:22:20:  
    10. E1:AF:0E:05:B2:CE:E0:2F:94:B6:94  
    11. Signature algorithm name: SHA1withDSA  
    12. Version: 3  
    13.   
    14. Extensions:  
    15.   
    16. #1: ObjectId: 2.5.29.14 Criticality=false  
    17. SubjectKeyIdentifier [  
    18. KeyIdentifier [  
    19. 0000: 69 3E 6A D0 B5 B1 1F BD 48 46 E1 A4 6C 1F 71 90 i>j.....HF..l.q.  
    20. 0010: 29 06 3B 32 ).;2  
    21. ]  
    22. ]  
    23.   
    24. Trust this certificate? [no]: y  
    25. Certificate was added to keystore</span>  


    6)创建client的truststore文件并导入server的证书(其中包括server的公钥)。

    [plain] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">C:Program FilesJavajre7in>keytool -import -alias catserver -keystore c:\_tmpfoxclienttrust.keystore -storepass foxclienttrustks -file c:\_tmpcatserver.cer  
    2. Owner: CN=cat, OU=cat, O=cat, L=cat, ST=cat, C=ct  
    3. Issuer: CN=cat, OU=cat, O=cat, L=cat, ST=cat, C=ct  
    4. Serial number: 3e421457  
    5. Valid from: Wed Nov 05 16:13:52 CST 2014 until: Tue Feb 03 16:13:52 CST 2015  
    6. Certificate fingerprints:  
    7. MD5: 20:44:7C:E5:30:E6:7A:21:C2:49:64:77:E1:3A:A0:77  
    8. SHA1: 8B:02:D2:BE:98:2F:99:94:08:47:E2:96:EC:05:1B:5D:B1:8F:30:2F  
    9. SHA256: A6:66:85:F4:C2:B2:06:4E:2E:40:D8:52:84:6E:85:2B:5B:BB:C3:B0:9C:  
    10. 31:92:99:F5:91:5D:83:67:C8:4D:D8  
    11. Signature algorithm name: SHA256withRSA  
    12. Version: 3  
    13.   
    14. Extensions:  
    15.   
    16. #1: ObjectId: 2.5.29.14 Criticality=false  
    17. SubjectKeyIdentifier [  
    18. KeyIdentifier [  
    19. 0000: F5 91 E6 14 EE EF 5F 24 4F AC 6F A6 B8 36 A6 11 ......_$O.o..6..  
    20. 0010: 2B 5C DF 04 +..  
    21. ]  
    22. ]  
    23.   
    24. Trust this certificate? [no]: y  
    25. Certificate was added to keystore</span>  


    keysize
    如果加密算法是rsa,key size范围512->16384 bits,并且必须是64的倍数。
    如果加密算法是dsa,key size范围512->1024 bits,并且必须是64的倍数。

    sigalg
    如果加密算法是rsa,签名算法可以是md5withrsa/sha1withrsa/sha256withrsa/sha384withrsa/sha512withrsa
    如果加密算法是dsa,签名算法可以是sha1withdsa

    如果熟悉Java的socket编程,就会发现使用JSSE进行SSL/TLS编程其实和它很相似。
    区别在于ServerSocket对象换成了SSLServerSocket,Socket对象换成了SSLSocket对象。

    (二)server端处理流程和代码

    处理流程:
    1)加载server的keystore文件,需要指定keystore的密码(storepass)。
    KeyStore类型有如下三种: 
    jceks - The proprietary keystore implementation provided by the SunJCE provider. 
    jks - The proprietary keystore implementation provided by the SUN provider. 
    pkcs12 - The transfer syntax for personal identity information as defined in PKCS #12.

    2)加载server的truststore文件,需要指定truststore的密码(storepass)。

    3) 创建KeyManagerFactory对象并用1)中加载的keystore和server密钥对的密码(keypass)来初始化。

    4) 创建TrustManagerFactory对象并用2)中加载的truststore来初始化。truststore中存的是client的公钥,不需要keypass也可以访问。

    5)创建SSLContext并用3)和4)中创建的KeyManagerFactory和TrustManagerFactory对象来初始化。
    http://docs.Oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#SSLContext
    创建SSLContext是需要给出SSLContext Algorithms。上面这个链接中给出了合法的SSLContext Algorithms,有如下可用值。
    SSL - Supports some version of SSL; may support other versions 
    SSLv2 - Supports SSL version 2 or later; may support other versions 
    SSLv3 - Supports SSL version 3; may support other versions 
    TLS - Supports some version of TLS; may support other versions 
    TLSv1 - Supports RFC 2246: TLS version 1.0 ; may support other versions 
    TLSv1.1 - Supports RFC 4346: TLS version 1.1 ; may support other versions 
    TLSv1.2 - Supports RFC 5246: TLS version 1.2 ; may support other versions 

    6)创建SSLServerSocketFactory,在指定的端口上创建SSLServerSocket并设定需要客户端证书:setNeedClientAuth(true)

    7)在SSLServerSocket对象上调用accept()方法等待客户端的连接。
    客户端连上来之后这个函数会返回一个SSLSocket对象,在这个对象的输入输出流上进行读写。
    在这个SSLSocket对象上可以添加一个HandshakeCompletedListener的监听器,SSL/TLS握手结束后这个监听器的handshakeCompleted方法就会被调用。
    客户端有三种方法会触发握手:
    - 显式调用startHandshake方法/calling startHandshake which explicitly begins handshakes, or
    - 在socket对象上进行read或write操作/any attempt to read or write application data on this socket causes an implicit handshake, or
    - 在socket对象上调用getSession方法/a call to getSession tries to set up a session if there is no currently valid session, and an implicit handshake is done.

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">package learning.net.ssl;  
    2.   
    3. import java.io.BufferedReader;  
    4. import java.io.FileInputStream;  
    5. import java.io.IOException;  
    6. import java.io.InputStreamReader;  
    7. import java.io.PrintWriter;  
    8. import java.net.Socket;  
    9. import java.security.KeyStore;  
    10. import java.security.cert.X509Certificate;  
    11.   
    12. import javax.net.ssl.HandshakeCompletedEvent;  
    13. import javax.net.ssl.HandshakeCompletedListener;  
    14. import javax.net.ssl.KeyManagerFactory;  
    15. import javax.net.ssl.SSLContext;  
    16. import javax.net.ssl.SSLPeerUnverifiedException;  
    17. import javax.net.ssl.SSLServerSocket;  
    18. import javax.net.ssl.SSLServerSocketFactory;  
    19. import javax.net.ssl.SSLSocket;  
    20. import javax.net.ssl.TrustManagerFactory;  
    21.   
    22. public class CatServer implements Runnable, HandshakeCompletedListener {  
    23.   
    24.     public static final int SERVER_PORT = 11123;  
    25.   
    26.     private final Socket _s;  
    27.     private String peerCerName;  
    28.   
    29.     public CatServer(Socket s) {  
    30.         _s = s;  
    31.     }  
    32.   
    33.     public static void main(String[] args) throws Exception {  
    34.         String serverKeyStoreFile = "c:\_tmp\catserver.keystore";  
    35.         String serverKeyStorePwd = "catserverks";  
    36.         String catServerKeyPwd = "catserver";  
    37.         String serverTrustKeyStoreFile = "c:\_tmp\catservertrust.keystore";  
    38.         String serverTrustKeyStorePwd = "catservertrustks";  
    39.   
    40.         KeyStore serverKeyStore = KeyStore.getInstance("JKS");  
    41.         serverKeyStore.load(new FileInputStream(serverKeyStoreFile), serverKeyStorePwd.toCharArray());  
    42.   
    43.         KeyStore serverTrustKeyStore = KeyStore.getInstance("JKS");  
    44.         serverTrustKeyStore.load(new FileInputStream(serverTrustKeyStoreFile), serverTrustKeyStorePwd.toCharArray());  
    45.   
    46.         KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());  
    47.         kmf.init(serverKeyStore, catServerKeyPwd.toCharArray());  
    48.   
    49.         TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  
    50.         tmf.init(serverTrustKeyStore);  
    51.   
    52.         SSLContext sslContext = SSLContext.getInstance("TLSv1");  
    53.         sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);  
    54.   
    55.         SSLServerSocketFactory sslServerSocketFactory = sslContext.getServerSocketFactory();  
    56.         SSLServerSocket sslServerSocket = (SSLServerSocket) sslServerSocketFactory.createServerSocket(SERVER_PORT);  
    57.         sslServerSocket.setNeedClientAuth(true);  
    58.   
    59.         while (true) {  
    60.             SSLSocket s = (SSLSocket)sslServerSocket.accept();  
    61.             CatServer cs = new CatServer(s);  
    62.             s.addHandshakeCompletedListener(cs);  
    63.             new Thread(cs).start();  
    64.         }  
    65.     }  
    66.   
    67.     @Override  
    68.     public void run() {  
    69.         try {  
    70.             BufferedReader reader = new BufferedReader(new InputStreamReader(_s.getInputStream()));  
    71.             PrintWriter writer = new PrintWriter(_s.getOutputStream(), true);  
    72.   
    73.             writer.println("Welcome~, enter exit to leave.");  
    74.             String s;  
    75.             while ((s = reader.readLine()) != null && !s.trim().equalsIgnoreCase("exit")) {  
    76.                 writer.println("Echo: " + s);  
    77.             }  
    78.             writer.println("Bye~, " + peerCerName);  
    79.         } catch (Exception e) {  
    80.             e.printStackTrace();  
    81.         } finally {  
    82.             try {  
    83.                 _s.close();  
    84.             } catch (IOException e) {  
    85.                 e.printStackTrace();  
    86.             }  
    87.         }  
    88.     }  
    89.   
    90.     @Override  
    91.     public void handshakeCompleted(HandshakeCompletedEvent event) {  
    92.         try {  
    93.             X509Certificate cert = (X509Certificate) event.getPeerCertificates()[0];  
    94.             peerCerName = cert.getSubjectX500Principal().getName();  
    95.         } catch (SSLPeerUnverifiedException ex) {  
    96.             ex.printStackTrace();  
    97.         }  
    98.     }  
    99.   
    100. }</span>  

    (三)client端处理流程和代码

    处理流程:(1~5和server相同)
    1)加载client的keystore文件。

    2)加载client的truststore文件。

    3) 创建KeyManagerFactory对象并初始化。

    4) 创建TrustManagerFactory对象并初始化。truststore中存的是server的公钥,不需要keypass也可以访问。

    5)创建SSLContext并用3)和4)中创建的KeyManagerFactory和TrustManagerFactory对象来初始化。

    6)创建SSLSocketFactory,在指定的网络地址和端口上创建SSLSocket。

    7)在这个SSLSocket对象的输入输出流上进行读写。

    [java] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <span style="font-family:Verdana;">package learning.net.ssl;  
    2.   
    3. import java.io.BufferedReader;  
    4. import java.io.FileInputStream;  
    5. import java.io.IOException;  
    6. import java.io.InputStreamReader;  
    7. import java.io.PrintWriter;  
    8. import java.net.Socket;  
    9. import java.security.KeyStore;  
    10.   
    11. import javax.net.ssl.KeyManagerFactory;  
    12. import javax.net.ssl.SSLContext;  
    13. import javax.net.ssl.SSLSocketFactory;  
    14. import javax.net.ssl.TrustManagerFactory;  
    15.   
    16. public class FoxClient {  
    17.     public static void main(String[] args) throws Exception {  
    18.         String clientKeyStoreFile = "c:\_tmp\foxclient.keystore";  
    19.         String clientKeyStorePwd = "foxclientks";  
    20.         String foxclientKeyPwd = "foxclient";  
    21.         String clientTrustKeyStoreFile = "c:\_tmp\foxclienttrust.keystore";  
    22.         String clientTrustKeyStorePwd = "foxclienttrustks";  
    23.   
    24.         KeyStore clientKeyStore = KeyStore.getInstance("JKS");  
    25.         clientKeyStore.load(new FileInputStream(clientKeyStoreFile), clientKeyStorePwd.toCharArray());  
    26.   
    27.         KeyStore clientTrustKeyStore = KeyStore.getInstance("JKS");  
    28.         clientTrustKeyStore.load(new FileInputStream(clientTrustKeyStoreFile), clientTrustKeyStorePwd.toCharArray());  
    29.   
    30.         KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());  
    31.         kmf.init(clientKeyStore, foxclientKeyPwd.toCharArray());  
    32.   
    33.         TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  
    34.         tmf.init(clientTrustKeyStore);  
    35.   
    36.         SSLContext sslContext = SSLContext.getInstance("TLSv1");  
    37.         sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);  
    38.           
    39.         SSLSocketFactory socketFactory = sslContext.getSocketFactory();  
    40.         Socket socket = socketFactory.createSocket("localhost", CatServer.SERVER_PORT);  
    41.           
    42.         PrintWriter out = new PrintWriter(socket.getOutputStream(), true);  
    43.         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
    44.           
    45.         send("hello", out);  
    46.         send("exit", out);  
    47.         receive(in);  
    48.         socket.close();  
    49.     }  
    50.       
    51.     public static void send(String s, PrintWriter out) throws IOException {  
    52.         System.out.println("Sending: " + s);       
    53.         out.println(s);  
    54.     }  
    55.   
    56.     public static void receive(BufferedReader in) throws IOException {  
    57.         String s;  
    58.         while ((s = in.readLine()) != null) {  
    59.             System.out.println("Reveived: " + s);  
    60.         }  
    61.     }  
    62. }</span>  

    (四)使用Openssl进行证书签名

    如果需要对证书进行签名,可以使用keytool生成一个csr(certificate sign request), 然后提交到一个CA进行签名。这里使用openssl提供的CA功能。

    1)[openssl]生成CA的RSA私钥。
    bash-3.00$ openssl genrsa -out cakey.pem 1024

    2)[openssl]使用CA.sh脚本初始化CA。脚本会要求输入刚才生成的私钥文件。
    bash-3.00$ CA.sh -newca
    CA certificate filename (or enter to create)
    cakey.pem

    3)[openssl]利用CA私钥生成自签名的CA根证书。
    指定x509参数表示要生成自签名的证书。(我们知道证书里面只包含公钥,为什么从私钥可以生成证书呢?这是因为私钥里面包含RSA算法所需的参数,其实可以算出公钥,后面会详细解释)
    bash-3.00$ openssl req -new -x509 -key cakey.pem -out ca.cer -config openssl.cnf
    Linux上openssl.cnf的路径/etc/pki/tls/openssl.cnf,可以拷贝一份到当前目录)

    4)[keytool]生成server的keystore文件。
    C:Program FilesJavajre7>keytool -genkey -alias catserver -keyalg rsa -keysize 1024 -sigalg sha256withrsa -keypass catserver -keystore c:\_tmpcatserver.keystore -storepass catserverks

    5)[keytool]生成server的csr.
    C:Program FilesJavajre7>keytool -certreq -alias catserver -file c:\_tmpcatserver.csr -keypass catserver -keystore c:\_tmpcatserver.keystore -storepass catserverks

    6) [openssl]对server的csr进行签名得到server证书
    bash-3.00$ openssl ca -in catserver.csr -out catserver.cer -cert ca.cer -keyfile cakey.pem -config openssl.cnf
    (如果是因为权限问题,不能访问CA的newcerts目录,可以先进行如下操作:
    bash-3.00$ mkdir newcerts 
    bash-3.00$ touch index.txt 
    bash-3.00$ echo 01 > serial)

    7)[keytool]生成client的keystore文件
    C:Program FilesJavajre7>keytool -genkey -alias foxclient -keyalg dsa -keysize 512 -sigalg sha1withdsa -keypass foxclient -keystore c:\_tmpfoxclient.keystore -storepass foxclientks

    8)[keytool]生成client的csr.
    C:Program FilesJavajre7>keytool -certreq -alias foxclient -file c:\_tmpfoxclient.csr -keypass foxclient -keystore c:\_tmpfoxclient.keystore -storepass foxclientks

    9) [openssl]对client的csr进行签名得到client证书
    bash-3.00$ openssl ca -in foxclient.csr -out foxclient.cer -cert ca.cer -keyfile cakey.pem -config openssl.cnf

    现在我们有如下文件:
    catserver.keystore -- server的keystore文件
    catserver.cer -- server证书文件,已经由CA签名。

    foxclient.keystore -- client的keystore文件
    foxclient.cer -- client证书文件,已经由CA签名。

    ca.cer -- CA的证书文件。作为根证书。

    接下来我们还需要
    10)[keytool]导入ca.cer和catserver.cer到catserver.keystore
    keytool -import -trustcacerts -alias ca -keystore c:\_tmpcatserver.keystore -storepass catserverks -file c:\_tmpca.cer
    keytool -import -alias catserver -keypass catserver -keystore c:\_tmpcatserver.keystore -storepass catserverks -file c:\_tmpcatserver.cer

    11)[keytool]导入ca.cer和foxclient.cer到foxclient.keystore
    keytool -import -trustcacerts -alias ca -keystore c:\_tmpfoxclient.keystore -storepass foxclientks -file c:\_tmpca.cer
    keytool -import -alias foxclient -keypass foxclient -keystore c:\_tmpfoxclient.keystore -storepass foxclientks -file c:\_tmpfoxclient.cer

    12)[keytool]创建server的truststore文件并导入ca.cer和foxclient.cer.
    keytool -import -trustcacerts -alias ca -keystore c:\_tmpcatservertrust.keystore -storepass catservertrustks -file c:\_tmpca.cer
    keytool -import -alias foxclient -keystore c:\_tmpcatservertrust.keystore -storepass catservertrustks -file c:\_tmpfoxclient.cer

    13)[keytool]创建client的truststore文件并导入ca.cer和catserver.cer.
    keytool -import -trustcacerts -alias ca -keystore c:\_tmpfoxclienttrust.keystore -storepass foxclienttrustks -file c:\_tmpca.cer
    keytool -import -alias catserver -keystore c:\_tmpfoxclienttrust.keystore -storepass foxclienttrustks -file c:\_tmpcatserver.cer

    *前面提到可以从CA的私钥文件生成CA的根证书。证书里面其实包含的是公钥。
    其实openssl也提供命令可以直接从私钥cakey.pem生成公钥。
    openssl rsa -in cakey.pem -pubout -out caputkey.pem
    为什么能够从私钥推导出公钥呢?
    这需要了解RSA算法-〉http://blog.csdn.NET/fw0124/article/details/41118525
    原因很简单,因为私钥中也包含了计算公钥所需的参数n和e。

    *可以使用openssl来生成server的证书,步骤如下
    openssl genrsa -out catserverkey.pem 1024
    openssl req -new -key catserverkey.pem -out catserver.csr -config openssl.cnf
    openssl ca -in catserver.csr -out catserver.cer -cert ca.cer -keyfile cakey.pem -config openssl.cnf

    =====================================

    如果openssl ca ...进行签名的时候碰到
    The stateOrProvinceName field needed to be the same in the ...的错误,可以修改openssl.cnf文件:
    [ policy_match ]
    countryName             = optional
    stateOrProvinceName     = optional
    organizationName        = optional
    organizationalUnitName  = optional

    如果遇到
    failed to update database
    TXT_DB error number 2     的错误,
    删除index.txt,并再touch下

    如果keytool -import命令导入签名后的证书的时候遇到以下错误
    keytool 错误: java.lang.Exception: 无法从回复中建立链
    重新导入下ca.cer即可。
    keytool -delete -alias ca -keystore c:\_tmpcatserver.keystore -storepass catserverks
    keytool -import -trustcacerts -alias ca ...

    ======================================

    CER文件到PEM文件的转换较简单。这两者都是X509证书,编码不同,使用openssl工具即可:

    openssl x509 -inform der -in catserver.cer -out catserver.pem

     

     

    (五)如何从.keystore文件中导出私钥

    Keytool不支持直接从.keystore中导出私钥。但是可以把JKS文件转换成openssl支持的PKCS#12格式的文件。

    所以可以通过下面2步来从.keystore中导出私钥。

    ➜ ~ keytool -importkeystore -srckeystore catserver.keystore -destkeystore catserver.p12 -deststoretype PKCS12 -srcalias catserver -srcstorepass catserverks -srckeypass catserver -deststorepass catserverks -destkeypass catserver
    Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -destkeypass value.
    ➜  ~  openssl pkcs12 -in catserver.p12  -nodes -nocerts -out catserverkey.pem
    Enter Import Password:
    MAC verified OK
    ➜  ~

    *-nodes选项意思是No DES,即不加密导出的私钥。

  • 相关阅读:
    巧用加密方法保障电子邮件系统安全 狼人:
    网管员注意:保障邮件安全的七条措施 狼人:
    全面剖析DNS 0DAY攻击、威胁以及防治 狼人:
    简述:电子邮件安全发展 狼人:
    IE漏洞致数百万用户中招 快用瑞星卡卡打补丁 狼人:
    警惕可执行文件:三类危险TXT类型文件 狼人:
    安全使用电子邮件十三法 狼人:
    提高IE和Email的安全性的四步骤 狼人:
    了解电子邮件加密 保证隐私内容安全 狼人:
    防不胜防 了解DNS缓存中毒攻击原理 狼人:
  • 原文地址:https://www.cnblogs.com/heyanan/p/6826093.html
Copyright © 2020-2023  润新知