`
zl198751
  • 浏览: 279596 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SSL 双向认证的配置总结

阅读更多

sl的原理和细节配置在之前两个博文中已经提到了。接下来总结下ssl的具体配置。主要感谢三篇文章。

ssl双向认证的客户端游览器的实现:

http://blog.csdn.net/jasonhwang/archive/2008/04/26/2329589.aspx

http://blog.csdn.net/jasonhwang/archive/2008/04/29/2344768.aspx

ssl双向认证的java调用实现:

http://www.blogjava.net/stone2083/archive/2007/12/20/169015.html

 

ssl双向认证的客户端游览器的实现主要是在Linux下实现的,稍微修改路径就可以在windows下实现。

注意:若客户端游览器没有ca证书的话,也是可以访问服务器的,客户端的ca证书是用来验证服务器是否有效的,若没有ca证书,游览器会弹出警告,让客户决定是否访问。

对于服务器端,用于签名的ca证书已经加入到trustKeyStore中,用于server认证客户端是否可信。

下面是主要代码:

env.bat:

set OPENSSL_HOME=C:\temp\testca
set SERVER=%OPENSSL_HOME%\Server
set CLIENT=%OPENSSL_HOME%\Client
set CA=%OPENSSL_HOME%\CA
set CONF=%OPENSSL_HOME%\conf

 

gentestca.conf:

[req]
default_keyfile = $ENV::OPENSSL_HOME/CA/cakey.pem
default_md = md5
prompt = no
distinguished_name = ca_distinguished_name
x509_extensions = ca_extensions
 
[ca_distinguished_name]
organizationName = VictorOrg
organizationalUnitName  = VictorDepartment
commonName = VictorCA
emailAddress = ca_admin@victororg.com
 
[ca_extensions]
basicConstraints = CA:true

 

testca.conf:

[ ca ]
default_ca     = testca   # The default ca section 需要配置
 
[ testca ]
dir            = $ENV::OPENSSL_HOME      # top dir
database       = $dir/index.txt          # index file.
new_certs_dir  = $dir/newcerts           # new certs dir
 
certificate    = $ENV::CA/cacert.pem         # The CA cert
serial         = $dir/serial             # serial no file
private_key    = $ENV::CA/cakey.pem  # CA private key
RANDFILE       = $ENV::CA/.rand      # random number file
 
default_days   = 365                     # how long to certify for
default_crl_days= 30                     # how long before next CRL
default_md     = md5                     # message digest method to use
unique_subject = no                      # Set to 'no' to allow creation of
                                         # several ctificates with same subject.
policy         = policy_any              # default policy
 
[ policy_any ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

generateCA.bat:

openssl req -x509 -newkey rsa:2048 -out CA/cacert.pem -outform PEM -days 2190 -config "%OPENSSL_HOME%\conf\gentestca.conf"

openssl pkcs12 -export -clcerts -in CA/cacert.pem -inkey CA/cakey.pem -out CA/root.p12


keytool -keystore %CA%\truststore.jks -keypass 444444 -storepass 444444 -alias ca -import -trustcacerts -file %CA%\cacert.pem

 

generateServer.bat:

openssl req -newkey rsa:1024 -keyout %SERVER%\serverkey.pem -keyform PEM -out %SERVER%\serverreq.pem -outform PEM  -subj "/O=ABCom/OU=servers/CN=servername"

openssl ca -in %SERVER%\serverreq.pem -out %SERVER%\servercert.pem -config "%CONF%\testca.conf"

openssl pkcs12 -export -in %SERVER%\servercert.pem -inkey %SERVER%\serverkey.pem -out %SERVER%\server.p12 -name tomcat -CAfile "%CA%\cacert.pem" -caname root -chain

 

 

generateClient.bat:

openssl req -newkey rsa:1024 -keyout %CLIENT%\clientkey.pem -keyform PEM -out %CLIENT%\clientreq.pem -outform PEM -subj "/O=TestCom/OU=TestOU/CN=testuser1"

openssl ca -in %CLIENT%\clientreq.pem -out %CLIENT%\clientcert.pem -config "%CONF%\testca.conf"

openssl pkcs12 -export -in %CLIENT%\clientcert.pem -inkey %CLIENT%\clientkey.pem -out %CLIENT%\client.p12 -name client -chain -CAfile "%CA%\cacert.pem"

 

 

tomcat 中 server.xml:

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               maxhttpheadersize="8192"
               minsparethreads="25" maxsparethreads="75"
               clientAuth="true" sslProtocol="TLS"
               disableUploadTimeout="true" enableLookups="false" acceptCount="100"

               keystoreType="PKCS12" keystoreFile="C:/temp/ca_9_13/server.p12" keystorePass="333333"
               truststoreType="JKS" truststoreFile="C:/temp/ca_9_13/truststore.jks" truststorePass="444444"    
               />

 

 

ssl双向认证的java调用实现:

用java代码调用服务器的https时,必须在客户端地java代码中的trustKeyStore加入服务器的ca,因为程序不能像人一样主观判断该网站是否可以访问。

env.bat,gentestca.conf,testca.conf,generateCA.bat与上面配置一致。

 

generateServerKeyStore.bat

keytool -keystore %SERVER%\server.jks -keypass 222222 -storepass 222222 -alias serverkey -genkey -keyalg RSA -dname "CN=servername, OU=servers, O=ABCom"

keytool -export -alias serverkey  -keypass 222222 -storepass 222222 -keystore %SERVER%\server.jks -file %SERVER%\server.crt

keytool -import -alias serverkey -keypass 222222 -storepass 222222 -file %SERVER%\server.crt -keystore %CLIENT%\tclient.keystore


generateClientKeyStore.bat:
keytool -genkey -alias clientkey -keystore %CLIENT%\client.jks -keypass 777777 -storepass 777777 -keyalg RSA -dname "CN=servername, OU=servers, O=ABCom"
keytool -export -alias clientkey -keystore %CLIENT%\client.jks -file %CLIENT%\client.crt -keypass 777777 -storepass 777777
keytool -import -alias clientkey -file %CLIENT%\client.crt -keystore %SERVER%\tserver.keystore -keypass 777777 -storepass 777777

 

tomcat 中 server.xml:

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               maxhttpheadersize="8192"
               minsparethreads="25" maxsparethreads="75"
               clientAuth="true" sslProtocol="TLS"
               disableUploadTimeout="true" enableLookups="false" acceptCount="100"

               keystoreFile="C:\temp\keystore_9_14\server.jks" keystorePass="222222" keystoreType="JKS"
               truststoreFile="C:\temp\keystore_9_14\tserver.keystore" truststorePass="777777" truststoreType="JKS"
               />

 

 

客户端java代码:

public class HttpsTest {
    public static final String CLIENT_KEY_STORE_PASSWORD = "777777";
    public static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "222222";
    
    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
    
    public static void main(String[] args) throws NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException, UnrecoverableKeyException, KeyManagementException {
        SSLContext ctx = SSLContext.getInstance("SSL");

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        
        KeyStore ks = KeyStore.getInstance("JKS");
        KeyStore tks = KeyStore.getInstance("JKS");
        
        ks.load(new FileInputStream("C:/temp/keystore_9_14/client.jks"), CLIENT_KEY_STORE_PASSWORD.toCharArray());
        tks.load(new FileInputStream("C:/temp/keystore_9_14/tclient.keystore"),  CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());
        
        kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());
        tmf.init(tks);
        
        ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        
        String url = "https://****:8443/****";
        URL myURL = new URL(url);
        HttpsURLConnection httpsConn = (HttpsURLConnection) myURL.openConnection();
        
        httpsConn.setHostnameVerifier(new TrustAnyHostnameVerifier());
        httpsConn.setSSLSocketFactory(ctx.getSocketFactory());
        
        httpsConn.setRequestMethod("GET");
        httpsConn.setRequestProperty("Connection", "Keep-Alive");
        httpsConn.setUseCaches(false);
        httpsConn.setReadTimeout(60000);
        httpsConn.setRequestProperty("Content-Type","text/html; charset=UTF-8");
        if (httpsConn.getResponseMessage().equalsIgnoreCase("ok")) {
            System.out.println("ok");
        } else {
            System.out.println("error");
        } 
    }
}                  

 

 

 

 

代码下载:密码123456

 

分享到:
评论

相关推荐

    详解Nginx SSL快速双向认证配置(脚本)

    **Nginx SSL双向认证配置详解** 在网络安全日益重要的今天,服务器与客户端之间的通信安全成为了一个不可忽视的问题。本文将详细介绍如何在Nginx服务器上配置SSL双向认证,以提高服务器的安全性,允许只有经过验证...

    Weblogic配置SSL双向认证

    Weblogic 配置 SSL 双向认证 Weblogic 配置 SSL 双向认证是为了确保 Web 应用程序的安全性和加密性。SSL(Secure Sockets Layer)是用于加密 Internet 通信的安全协议。双向认证是指客户端和服务端都需要验证对方的...

    SSL双向认证SSL双向认证

    SSL(Secure Sockets Layer)双向认证...总的来说,SSL双向认证是一种强大的安全措施,它可以提供更高的信任度和数据保护,但同时也带来了额外的配置和管理挑战。在选择实施双向认证时,应根据实际需求和环境进行权衡。

    android 使用HttpsURLConnection方式的SSL双向认证

    此项目“android 使用HttpsURLConnection方式的SSL双向认证”着重讲解了如何在Android应用中通过HttpsURLConnection实现SSL的客户端和服务器端之间的双向身份验证,确保通信的隐私和完整性。 首先,我们需要理解SSL...

    通过tomcat实现SSL双向认证

    SSL 双向认证是一种高级的身份验证机制,它需要同时配置 Web 服务器证书和客户端证书,并在服务器和客户端之间正确安装根证书。下面将详细介绍如何通过 Tomcat 实现 SSL 双向认证。 概念:SSL/TLS SSL/TLS 是一种...

    activemq ssl双向认证连接

    在ActiveMQ中配置SSL双向认证,我们需要以下步骤: 1. **生成证书**:首先,你需要为服务器和客户端分别生成证书。这通常通过使用OpenSSL工具完成,可以创建自签名证书或者由权威证书颁发机构(CA)签发。描述中...

    IOS,Android SSL双向认证HTTPS方式请求及配置证书

    总结,iOS和Android应用实现SSL双向认证HTTPS请求涉及到证书的创建、导入、配置以及自定义安全策略。开发者必须理解SSL/TLS的工作原理,以确保数据传输的安全性,同时兼顾用户体验。在实际应用中,建议遵循最佳实践...

    Java实现SSL双向认证的方法

    Java中的SSL双向认证是一种安全通信机制,用于确保服务器和客户端之间的通信不仅加密,而且双方的身份都得到验证。这种机制在需要高安全性交互的应用场景中,如金融交易、企业内部网络通信等,尤其重要。 SSL...

    Java ssl socket 双向认证

    在这个场景中,我们讨论的是如何在Java中设置和实现SSL套接字的双向认证。双向认证通常在高安全性环境中使用,例如银行、政府机构或企业内部网络,因为它们需要确保通信双方都是可信的。 首先,为了实现双向认证,...

    java实现_SSL双向认证.doc

    java实现_SSL双向认证,里面详细介绍怎样实现,还包括完整的实现代码,直接可用

    tomcat实现SSL双向认证

    本文将详细介绍如何在 Tomcat 中实现 SSL 双向认证,包括使用 JDK 的 keytool 工具创建证书、配置 Tomcat 服务器和客户端证书等。 一、SSL 双向认证的重要性 在 Web 应用程序中,安全性是非常重要的,特别是在涉及...

    客户端与服务器SSL双向认证(客户端:java-服务端:java)

    下面将详细介绍Java实现SSL双向认证的步骤、关键概念和技术要点。 1. **生成证书**: - 服务器证书:首先,你需要为服务器生成一个自我签名的证书,这可以通过Java的keytool工具完成。创建一个Key Pair(公钥和...

    JAVA实现的SSL/TLS双向认证源代码

    通过`keytool`和`openssl`管理证书,以及在`TeslaSSLServer`和`TeslaSSLClient`中配置SSLContext,我们可以创建安全的双向认证连接。这个过程虽然复杂,但对于保护敏感数据的传输是必不可少的。

    Tomcat配置SSL双向认证

    ### Tomcat配置SSL双向认证详解 #### 一、SSL双向认证概述 SSL(Secure Sockets Layer,安全套接层)是一种用于确保Web通信安全的技术,它通过加密数据传输来保护信息不被未授权访问。SSL协议的核心是实现客户端与...

    WEB服务器SSL双向认证

    #### 三、SSL双向认证配置 - **配置要点**: - 在服务器端配置中启用双向认证功能。 - 选择合适的证书验证模式,如“要求证书且验证”。 - 确保客户端也配置了相应的证书以便进行身份验证。 #### 四、证书管理 ...

    java实现-SSL双向认证1.docx

    Java中的SSL双向认证是一种安全通信的方法,用于在网络中保护数据传输的安全性。它结合了SSL(Secure Sockets Layer)和TLS(Transport Layer Security)协议,这些协议提供了数据加密、服务器验证以及客户端验证等...

    Tomcat6配置使用SSL双向认证

    ### 四、Tomcat6 SSL双向认证配置 编辑Tomcat的`conf/server.xml`文件,找到`&lt;Connector&gt;`元素,添加以下属性以启用SSL: ```xml clientAuth="true" sslProtocol="TLS" keystoreFile="path/to/server.p12" ...

Global site tag (gtag.js) - Google Analytics