`
zhaomengsen
  • 浏览: 207764 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

SSL双向认证的例子

    博客分类:
  • jms
阅读更多

首先创建服务器端私有密钥和公共密钥
1, keytool -genkey -alias clientkey -keystore kserver.ks
    密码: serverpass
2, keytool -export -alias serverkey -keystore kserver.ks -file server.crt
3, keytool -import -alias serverkey -file server.crt -keystore tclient.ks
    密码: clientpublicpass

下面创建客户器端私有密钥和公共密钥
1, keytool -genkey -alias clientkey -keystore kclient.ks
    密码: clientpass
2, keytool -export -alias clientkey -keystore kclient.ks -file client.crt
3, keytool -import -alias clientkey -file client.crt -keystore tserver.ks
    密码: serverpublicpass

把服务器端产生的公共密钥放到客户端, 同样把客户端创建的公共密钥放到服务器端.

下面是服务器端代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;

public class SSLTestServer {

    public static void main(String[] args) throws Exception {
        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("cert/kserver.ks"), "serverpass".toCharArray());
        tks.load(new FileInputStream("cert/tserver.ks"), "serverpublicpass".toCharArray());

        kmf.init(ks, "serverpass".toCharArray());
        tmf.init(tks);

        ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        SSLServerSocket serverSocket = (SSLServerSocket) ctx.getServerSocketFactory().createServerSocket(8443);
        serverSocket.setNeedClientAuth(true);

        while (true) {
            try {
                Socket s = serverSocket.accept();
                InputStream input = s.getInputStream();
                OutputStream utput = s.getOutputStream();

                BufferedInputStream bis = new BufferedInputStream(input);
                BufferedOutputStream bos = new BufferedOutputStream(output);

                byte[] buffer = new byte[20];
                int length = bis.read(buffer);
                System.out.println("Receive: " + new String(buffer, 0, length).toString());

                bos.write("Hello".getBytes());
                bos.flush();

                s.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
}

下面是客户端代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;

public class SSLTestClient {

    public static void main(String[] args) throws Exception {
        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("cert/kclient.ks"), "clientpass".toCharArray());
        tks.load(new FileInputStream("cert/tclient.ks"), "clientpublicpass".toCharArray());

        kmf.init(ks, "clientpass".toCharArray());
        tmf.init(tks);

        ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        SSLSocket sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket("localhost", 8443);
        InputStream input = sslSocket.getInputStream();
        OutputStream utput = sslSocket.getOutputStream();

        BufferedInputStream bis = new BufferedInputStream(input);
        BufferedOutputStream bos = new BufferedOutputStream(output);

        bos.write("Hello".getBytes());
        bos.flush();

        byte[] buffer = new byte[20];
        int length = bis.read(buffer);
        System.out.println(new String(buffer, 0, length));

        sslSocket.close();  
    }

}

常见的HTTPS传输, 不需要进行客户端认证, 也就是单向认证. 这时也就不需要创建客户端的私钥和公钥. 服务器端也只要配置一下服务器端的私钥即可, 当客户端浏览器访问时会生成一个证书文件,类似于上面创建的crt文件. 如果需要程序访问,可以通过这个crt文件生成一个keystore. 然后是用这个keystore作为trust keystore即可.

分享到:
评论

相关推荐

    java实现_SSL双向认证.doc

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

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

    压缩包中的`wss`测试例子展示了如何在WebSocket上应用SSL/TLS双向认证。 6. **证书导入**:为了测试,你需要将服务器的PKCS12格式的证书导入到浏览器的信任存储中,以便浏览器可以验证服务器的身份。同样,客户端也...

    C# TLS SSL TCP双向认证 X509Store SslStream Certificate

    C# TLS SSL TCP双向认证 X509Store SslStream Certificate Visual Studio 2017 命令提示 键入: makecert -r -pe -n “CN=TestServer” -ss Root -sky exchange 等待来自客户端的连接... 显示安全等级 密钥套件: Aes...

    GMSSL双向认证分析.docx

    双向认证是GMSSL的一个重要特性,它确保了通信双方的身份都能被正确验证,增强了网络通信的安全性。 在TLS协议中,双向认证主要通过TLS握手协议进行。这个过程分为客户端和服务器端交互的多个步骤: 1. **Client ...

    java https ssl 实例 例子

    JAVA SSL SOCKET 双向认证是指客户端和服务器双方都需要验证对方的身份。这种方式可以提供更高的安全性。 十五、建立一个信息安全通道,来保证数据传输的安全;确认网站的真实性 通过使用 SSL 协议,我们可以建立...

    Openssl实现双向认证教程(附服务端客户端代码)

    总结,OpenSSL双向认证涉及证书的生成、配置SSL_CTX上下文、加载证书和私钥,以及在服务端和客户端进行验证。正确实施双向认证可以显著提高通信的安全性,防止未经授权的第三方干扰或窃取数据。对于开发者来说,理解...

    易语言-Socket实现OpenSSL双向认证连接

    首先,理解SSL双向认证的概念是至关重要的。在传统的单向认证中,服务器验证客户端的身份,而双向认证则要求双方都提供有效的身份证明。这意味着客户端不仅要验证服务器的身份,服务器也需要验证客户端的身份。这种...

    vc手工实现ssl

    - 初始化SSL上下文(SSL_CTX),设置证书和私钥(如果是双向认证)。 - 将套接字与SSL上下文关联,进行SSL连接。 - 发送SSL握手请求,等待服务器响应。 - 完成握手后,可以开始加密的数据传输。 2. **服务器端...

    sslink.zip

    - `SetSSLOptions`:配置SSL选项,开启双向认证。 - `SendRequest`和`ReceiveResponse`:发送HTTP请求和接收响应。 通过以上分析,我们可以看出,`sslink.zip`提供的代码示例是关于如何在VC++ MFC环境中利用...

    tlslite 经典例子

    在某些双向认证场景下,客户端也会向服务器提供自己的证书。 3. **serverX509Key.pem**: 服务器的私钥文件,对应于serverX509Cert.pem中的公钥。私钥用于解密由客户端用公钥加密的信息,以及生成数字签名。 4. **...

    HP-Socket-5.5.1中文模块带例子-易语言

    同时,如果需要双向认证,客户端也需要提供自己的证书(如client.crt)。CA2.crt可能是证书颁发机构的根证书,用于验证服务器和客户端证书的合法性。 在使用HP-Socket-5.5.1模块时,开发者需要理解以下核心概念: -...

    https 访问操作

    2. **身份验证**:通常通过数字证书来验证服务器的身份,有时也会双向验证客户端身份。 3. **数据完整性**:通过消息认证码(MAC)或散列函数来防止数据在传输过程中被篡改。 #### 三、Java中的HTTPS访问示例 下面...

    Twisted-Proxy:扭曲的HTTP和HTTPs双向代理

    在上述例子中,`-s 4433`设置HTTPS代理在4433端口上运行,`-t 127.0.0.1:443`则表明HTTPS请求将被转发至本地的443端口,这是标准的HTTPS服务端口。 使用Twisted-Proxy,你可以创建一个高度自定义的代理服务器,包括...

    WebService开发实例图解教程

    - 可配置SSL连接为单向或双向认证。 11. **查看已发布EJB** - 在WebLogic管理控制台的“Deployment”部分,可以查看和管理所有已发布的EJB。 12. **消息驱动Bean(MDB)** - persistent MDB保证消息传递的可靠...

    net.rar_ftp http源码

    5. 安全性:讨论FTP和HTTP的安全增强,如FTPS(FTP over TLS/SSL)、HTTPS(HTTP over TLS/SSL)以及认证机制。 6. 错误处理与调试:提供常见网络错误的处理策略,以及如何调试网络应用。 7. 实践项目:可能包含...

    暗黑风格-图解网络-小林coding-v2.0.pdf

    超文本的典型例子是HTML文档,它通过各种标签定义了链接、图片等信息,浏览器通过解析这些标签来展示出包含丰富媒体的网页。 ### HTTP方法 HTTP定义了多种请求方法,常用的方法包括GET和POST。 #### GET方法 GET...

    WebRTC+websocket

    在WebRTC的例子中,WebSocket可能是用来传递信令信息的,比如初始化连接的offer/answer,以及ice候选等,这些都是建立和维护RTCPeerConnection所必需的。 **项目结构** 在"RTCApp"这个文件夹中,我们可以推测可能...

    Spring4+WebSocket+Socket+STOMP+Jetty构建示例

    通过建立连接,订阅频道,然后发送和接收消息,可以实现客户端和服务器的双向通信。 4. **Spring Message Broker** Spring提供了Message Broker接口,使得我们可以将消息代理集成到应用程序中。在这个例子中,我们...

    基于Vue-cli和Servlet的前后端分离的电商系统.zip

    本项目“基于Vue-cli和Servlet的前后端分离的电商系统”就是一个典型的例子,它结合了前端的Vue.js框架和后端的Servlet技术来实现一个完整的电子商务平台。下面将详细探讨相关知识点。 1. **Vue-cli**: Vue-cli是...

    局域网聊天工具

    此外,数据传输应加密,防止被未经授权的用户截取,SSL/TLS协议可以提供端到端的安全保障。 5. **界面设计**:用户界面(UI)是任何软件的重要组成部分。局域网聊天工具应有清晰的布局,易于理解和操作。设计上应...

Global site tag (gtag.js) - Google Analytics