精华内容
下载资源
问答
  • SSLContext

    万次阅读 2017-08-22 19:04:17
    1. 什么是SSLSocket JDK文档指出,SSLSocket扩展Socket并提供使用SSL或TLS协议的安全套接字。 这种套接字是正常的流套接字,但是它们在基础网络传输协议(如TCP)上添加了安全保护层。 具体安全方面的讨论见...

    1. 什么是SSLSocket

    JDK文档指出,SSLSocket扩展Socket并提供使用SSL或TLS协议的安全套接字。

    这种套接字是正常的流套接字,但是它们在基础网络传输协议(如TCP)上添加了安全保护层。

    具体安全方面的讨论见下一篇。本篇重点关注SSLSocket及相关几个类的使用。

     

    2. SSLSocket和相关类

    SSLSocket来自jsse(Java Secure Socket Extension)。

     

     

    (1)SSLContext: 此类的实例表示安全套接字协议的实现, 它是SSLSocketFactory、SSLServerSocketFactory和SSLEngine的工厂。

     

    (2)SSLSocket: 扩展自Socket

     

    (3)SSLServerSocket: 扩展自ServerSocket

     

    (4)SSLSocketFactory: 抽象类,扩展自SocketFactory, SSLSocket的工厂

     

    (5)SSLServerSocketFactory: 抽象类,扩展自ServerSocketFactory, SSLServerSocket的工厂

     

    (6)KeyStore: 表示密钥和证书的存储设施

     

    (7)KeyManager: 接口,JSSE密钥管理器

     

    (8)TrustManager: 接口,信任管理器(?翻译得很拗口)

     

    (9)X590TrustedManager: TrustManager的子接口,管理X509证书,验证远程安全套接字

     

    3. SSLContext的使用

     

     

    Java代码  收藏代码
    1. public static void main(String[] args) throws Exception {  
    2.     X509TrustManager x509m = new X509TrustManager() {  
    3.   
    4.         @Override  
    5.         public X509Certificate[] getAcceptedIssuers() {  
    6.             return null;  
    7.         }  
    8.   
    9.         @Override  
    10.         public void checkServerTrusted(X509Certificate[] chain,  
    11.                 String authType) throws CertificateException {  
    12.         }  
    13.   
    14.         @Override  
    15.         public void checkClientTrusted(X509Certificate[] chain,  
    16.                 String authType) throws CertificateException {  
    17.         }  
    18.     };  
    19.     // 获取一个SSLContext实例  
    20.     SSLContext s = SSLContext.getInstance("SSL");  
    21.     // 初始化SSLContext实例  
    22.     s.init(nullnew TrustManager[] { x509m },  
    23.             new java.security.SecureRandom());  
    24.     // 打印这个SSLContext实例使用的协议  
    25.     System.out.println("缺省安全套接字使用的协议: " + s.getProtocol());  
    26.     // 获取SSLContext实例相关的SSLEngine  
    27.     SSLEngine e = s.createSSLEngine();  
    28.     System.out  
    29.             .println("支持的协议: " + Arrays.asList(e.getSupportedProtocols()));  
    30.     System.out.println("启用的协议: " + Arrays.asList(e.getEnabledProtocols()));  
    31.     System.out.println("支持的加密套件: "  
    32.             + Arrays.asList(e.getSupportedCipherSuites()));  
    33.     System.out.println("启用的加密套件: "  
    34.             + Arrays.asList(e.getEnabledCipherSuites()));  
    35. }  

     运行结果如下:

     

     

    SSLContext.getProtocol(): 返回当前SSLContext对象的协议名称

    SSLContext.init():  初始化当前SSLContext对象。 三个参数均可以为null。 详见JDK文档。

    SSLEngine.getSupportedProtocols()等几个方法可以返回些 Engine上支持/已启用的协议、支持/已启用的加密套件

     

    4. SSLSocket和SSLServerSocket的使用

    这两个类的用法跟Socket/ServerSocket的用法比较类似。看下面的例子(主要为了验证SSLSocket的用法 ,I/O和多线程处理比较随意)

     

    4.1 SSLServerSocket

    (1)新建一个SSLServerSocket,并开始监听来自客户端的连接

     

     

    Java代码  收藏代码
    1. // 抛出异常  
    2. // javax.net.ssl.SSLException: No available certificate or key corresponds  
    3. // to the SSL cipher suites which are enabled.  
    4. public static void notOk() throws IOException {  
    5.     SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory  
    6.             .getDefault();  
    7.     SSLServerSocket server = (SSLServerSocket) factory  
    8.             .createServerSocket(10000);  
    9.     System.out.println("ok");  
    10.     server.accept();  
    11. }  

     server.accept()处抛出异常, 提示缺少证书。与ServerSocket不同, SSLServerSocket需要证书来进行安全验证。

     

    使用keytool工具生成一个证书。 步骤如下, 得到一个名为cmkey的证书文件

     

     

    (2)重新完善上面的代码。 主要增加两个功能: 使用名为cmkey的证书初始化SSLContext, echo客户端的消息。 代码如下

     

     

    Java代码  收藏代码
    1. // 启动一个ssl server socket  
    2. // 配置了证书, 所以不会抛出异常  
    3. public static void sslSocketServer() throws Exception {  
    4.   
    5.     // key store相关信息  
    6.     String keyName = "cmkey";  
    7.     char[] keyStorePwd = "123456".toCharArray();  
    8.     char[] keyPwd = "123456".toCharArray();  
    9.     KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());  
    10.   
    11.     // 装载当前目录下的key store. 可用jdk中的keytool工具生成keystore  
    12.     InputStream in = null;  
    13.     keyStore.load(in = Test2.class.getClassLoader().getResourceAsStream(  
    14.             keyName), keyPwd);  
    15.     in.close();  
    16.   
    17.     // 初始化key manager factory  
    18.     KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory  
    19.             .getDefaultAlgorithm());  
    20.     kmf.init(keyStore, keyPwd);  
    21.   
    22.     // 初始化ssl context  
    23.     SSLContext context = SSLContext.getInstance("SSL");  
    24.     context.init(kmf.getKeyManagers(),  
    25.             new TrustManager[] { new MyX509TrustManager() },  
    26.             new SecureRandom());  
    27.   
    28.     // 监听和接收客户端连接  
    29.     SSLServerSocketFactory factory = context.getServerSocketFactory();  
    30.     SSLServerSocket server = (SSLServerSocket) factory  
    31.             .createServerSocket(10002);  
    32.     System.out.println("ok");  
    33.     Socket client = server.accept();  
    34.     System.out.println(client.getRemoteSocketAddress());  
    35.   
    36.     // 向客户端发送接收到的字节序列  
    37.     OutputStream output = client.getOutputStream();  
    38.   
    39.     // 当一个普通 socket 连接上来, 这里会抛出异常  
    40.     // Exception in thread "main" javax.net.ssl.SSLException: Unrecognized  
    41.     // SSL message, plaintext connection?  
    42.     InputStream input = client.getInputStream();  
    43.     byte[] buf = new byte[1024];  
    44.     int len = input.read(buf);  
    45.     System.out.println("received: " + new String(buf, 0, len));  
    46.     output.write(buf, 0, len);  
    47.     output.flush();  
    48.     output.close();  
    49.     input.close();  
    50.   
    51.     // 关闭socket连接  
    52.     client.close();  
    53.     server.close();  
    54. }  
     

    4.2 SSLSocket

    (1)我们先使用一个普通的Socket尝试连接服务器端

     

    Java代码  收藏代码
    1. // 通过socket连接服务器  
    2. public static void socket() throws UnknownHostException, IOException {  
    3.     Socket s = new Socket("localhost"10002);  
    4.     System.out.println(s);  
    5.     System.out.println("ok");  
    6.   
    7.     OutputStream output = s.getOutputStream();  
    8.     InputStream input = s.getInputStream();  
    9.   
    10.     output.write("alert".getBytes());  
    11.     System.out.println("sent: alert");  
    12.     output.flush();  
    13.   
    14.     byte[] buf = new byte[1024];  
    15.     int len = input.read(buf);  
    16.     System.out.println("received:" + new String(buf, 0, len));  
    17. }  

     结果客户端和服务器端都出错。 客户端的错误是接收到乱码。 


    服务器则抛出异常

    javax.NET.ssl.SSLException: Unrecognized SSL message, plaintext connection?

     

    (2)改成SSLSocket, 但是不使用证书。客户端抛出sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

     

     

    Java代码  收藏代码
    1. // 不使用证书, 通过ssl socket连接服务器  
    2. // 抛出异常, 提示找不到证书  
    3. public static void sslSocket() throws UnknownHostException, IOException {  
    4.     SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory  
    5.             .getDefault();  
    6.     SSLSocket s = (SSLSocket) factory.createSocket("localhost"10002);  
    7.     System.out.println("ok");  
    8.   
    9.     OutputStream output = s.getOutputStream();  
    10.     InputStream input = s.getInputStream();  
    11.   
    12.     output.write("alert".getBytes());  
    13.     System.out.println("sent: alert");  
    14.     output.flush();  
    15.   
    16.     byte[] buf = new byte[1024];  
    17.     int len = input.read(buf);  
    18.     System.out.println("received:" + new String(buf, 0, len));  
    19. }  

    程序客户在不持有证书的情况下直接进行连接,服务器端会产生运行时异常javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown,不允许进行连接。 我们可以指定像下面这样执行客户端,服务器端可以成功echo客户端的发出的字符串"alert"

     

     Java  -Djavax.Net.ssl.trustStore=cmkey Client

     

    这里的cmkey即前面生成的证书文件。

     

    (3)改成SSLSocket, 对SSLContext进行如下初始化。

     

    Java代码  收藏代码
    1. public static void sslSocket2() throws Exception {  
    2.     SSLContext context = SSLContext.getInstance("SSL");  
    3.                // 初始化  
    4.     context.init(null,  
    5.             new TrustManager[] { new Test2.MyX509TrustManager() },  
    6.             new SecureRandom());  
    7.     SSLSocketFactory factory = context.getSocketFactory();  
    8.     SSLSocket s = (SSLSocket) factory.createSocket("localhost"10002);  
    9.     System.out.println("ok");  
    10.   
    11.     OutputStream output = s.getOutputStream();  
    12.     InputStream input = s.getInputStream();  
    13.   
    14.     output.write("alert".getBytes());  
    15.     System.out.println("sent: alert");  
    16.     output.flush();  
    17.   
    18.     byte[] buf = new byte[1024];  
    19.     int len = input.read(buf);  
    20.     System.out.println("received:" + new String(buf, 0, len));  
    21. }  

     服务器端可以成功echo客户端的发出的字符串"alert"。 完整代码见附件。

     

     

    参考  http://java.ccidnet.com/art/3737/20060808/789375_1.html

     http://blog.csdn.net/scliu0718/article/details/7198889

    http://www.iteye.com/topic/1114800

    http://410063005.iteye.com/blog/1751243

    展开全文
  • 我正在查看JSSE参考指南,我需要获取SSLContext的实例才能创建SSLEngine,因此我可以将它与Netty一起使用以启用安全性.要获取SSLContext的实例,我使用SSLContext.getInstance().我看到该方法被多次覆盖,因此我可以选择...

    我正在查看JSSE参考指南,我需要获取SSLContext的实例才能创建SSLEngine,因此我可以将它与Netty一起使用以启用安全性.

    要获取SSLContext的实例,我使用SSLContext.getInstance().我看到该方法被多次覆盖,因此我可以选择使用协议和安全提供程序.

    Here,我可以看到可以使用的算法列表.我应该使用哪种算法来实现安全通信?

    此外,由于可以指定要使用的安全提供程序,我应该使用哪个提供程序?

    谢谢

    解决方法:

    正如您在standard names documentation中看到的,所有条目(SSLv3,TLSv1.0,TLSv1.1,…)都表示它们可能支持其他版本.

    实际上,在Oracle JDK(和OpenJDK)中,他们都这样做.如果查看source code,则TLS10Context类用于TLS,SSL,SSLv3和TLS10,TLS11Context用于TLSv1.1,TLS12Context用于TLSv1.2.所有版本都支持所有版本的SSL / TLS,默认情况下启用的内容会有所不同.

    这可能与其他提供商或JRE供应商不同.您当然应该选择一个至少支持您要使用的协议版本的程序.

    作为一般规则,请使用最高版本号(SSLv3< TLSv1.0< TLSv1.1 ...),这可能取决于您要与之通信的各方支持的内容.

    默认情况下启用哪些协议取决于Oracle JRE的确切版本.

    在查看the source code for sun.security.ssl.SunJSSE in OpenJDK 7u40-b43时,就SSLContext协议而言,TLS只是TLSv1的别名(SSL和SSLv3也是如此).查看各种implementations of SSLContextImpl(这是SSLContextImpl本身的内部类):

    >所有支持所有协议.

    >默认情况下,在服务器端启用所有协议.

    >默认启用的客户端协议有所不同:

    > TLS10Context(用于协议SSL,SSLv3,TLS,TLSv1)默认在客户端启用SSLv3到TLSv1.0.

    > TLS11Context(用于协议TLSv1.1)默认情况下也启用TLSv1.1.

    > TLS12Context(用于协议TLSv1.2)默认情况下也启用TLSv1.2.

    >如果启用了FIPS,则不支持SSL(因此默认情况下不启用).

    同样,在查看the source code for sun.security.ssl.SunJSSE in OpenJDK 8u40-b25时,SSLContext协议TLSv1,TLSv1.1和TLSv1.2也使用TLS10Context,TLS11Context和TLS12Context,它们遵循与Java 7中相同的逻辑.

    但是,协议TLS不再是其中任何一个的别名.相反,它使用TLSContext,它依赖于jdk.tls.client.protocols系统属性中的值.从JSSE Reference guide开始:

    To enable specific SunJSSE protocols on the client, specify them in a comma-separated list within quotation marks; all other supported protocols are then disabled on the client. For example, if the value of this property is “TLSv1,TLSv1.1”, then the default protocol settings on the client for TLSv1 and TLSv1.1 are enabled on the client, while SSLv3, TLSv1.2, and SSLv2Hello are disabled on the client.

    如果此属性为空,则默认情况下在客户端和服务器端都启用所有协议.

    请注意,在这两种情况下(JRE 7和8),默认情况下通过SSLContext.getDefault()获得的SSLContext开箱即用,或多或少等同于使用协议TLS获得的SSLContext,并使用默认的truststore参数进行初始化,依此类推.

    标签:java,ssl,security,jsse

    来源: https://codeday.me/bug/20190923/1815660.html

    展开全文
  • import io.netty.handler.ssl.SslContext; //导入方法依赖的package包/类public void start() throws CertificateException, SSLException, InterruptedException {// Configure SSL.final SslContext sslCtx;if ...

    import io.netty.handler.ssl.SslContext; //导入方法依赖的package包/类

    public void start() throws CertificateException, SSLException, InterruptedException {

    // Configure SSL.

    final SslContext sslCtx;

    if (ssl) {

    SelfSignedCertificate ssc = new SelfSignedCertificate();

    sslCtx = SslContext.newServerContext(ssc.certificate(), ssc.privateKey());

    } else {

    sslCtx = null;

    }

    // configure metrics

    ScheduledExecutorService metricCollector = Executors.newScheduledThreadPool(1);

    MixServerMetrics metrics = new MixServerMetrics();

    ThroughputCounter throughputCounter = new ThroughputCounter(metricCollector, 5000L, metrics);

    if (jmx) {// register mbean

    MetricsRegistry.registerMBeans(metrics, port);

    }

    // configure initializer

    SessionStore sessionStore = new SessionStore();

    MixServerHandler msgHandler = new MixServerHandler(sessionStore, syncThreshold, scale);

    MixServerInitializer initializer = new MixServerInitializer(msgHandler, throughputCounter,

    sslCtx);

    Runnable cleanSessionTask = new IdleSessionSweeper(sessionStore, sessionTTLinSec * 1000L);

    ScheduledExecutorService idleSessionChecker = Executors.newScheduledThreadPool(1);

    try {

    // start idle session sweeper

    idleSessionChecker.scheduleAtFixedRate(cleanSessionTask, sessionTTLinSec + 10L,

    sweepIntervalInSec, TimeUnit.SECONDS);

    // accept connections

    acceptConnections(initializer, port, numWorkers);

    } finally {

    // release threads

    idleSessionChecker.shutdownNow();

    if (jmx) {

    MetricsRegistry.unregisterMBeans(port);

    }

    metricCollector.shutdownNow();

    }

    }

    展开全文
  • import io.netty.handler.ssl.SslContext; //导入方法依赖的package包/类public boolean tryConnect(boolean ssl, SimpleChannelInboundHandler default_handler, Auth auth, Runnable cancelTask){try{...

    import io.netty.handler.ssl.SslContext; //导入方法依赖的package包/类

    public boolean tryConnect(boolean ssl, SimpleChannelInboundHandler default_handler, Auth auth, Runnable cancelTask)

    {

    try

    {

    eventLoopGroup = NetworkUtils.eventLoopGroup(4);

    if (ssl) sslContext = SslContext.newClientContext(InsecureTrustManagerFactory.INSTANCE);

    Bootstrap bootstrap = new Bootstrap()

    .option(ChannelOption.SO_KEEPALIVE, true)

    .option(ChannelOption.TCP_NODELAY, true)

    .option(ChannelOption.IP_TOS, 24)

    .option(ChannelOption.AUTO_READ, true)

    .group(eventLoopGroup)

    .handler(new ChannelInitializer() {

    @Override

    protected void initChannel(Channel channel) throws Exception

    {

    if (sslContext != null)

    channel.pipeline().addLast(sslContext.newHandler(channel.alloc(), connectableAddress.getHostName(), connectableAddress.getPort()));

    NetworkUtils.initChannel(channel).pipeline().addLast(default_handler);

    }

    })

    .channel(NetworkUtils.socketChannel());

    this.channel = bootstrap.connect(connectableAddress.getHostName(), connectableAddress.getPort()).sync().channel().writeAndFlush(new PacketOutAuth(auth)).syncUninterruptibly().channel();

    return true;

    } catch (Exception ex)

    {

    connectionTrys++;

    System.out.println("Failed to connect... [" + connectionTrys + "]");

    System.out.println("Error: " + ex.getMessage());

    if(eventLoopGroup != null)

    eventLoopGroup.shutdownGracefully();

    eventLoopGroup = null;

    if (cancelTask != null)

    {

    cancelTask.run();

    }

    return false;

    }

    }

    展开全文
  • import io.netty.handler.ssl.SslContext; //导入方法依赖的package包/类/*** 业务线程池* 用以单独处理业务handler,避免造成IO线程的阻塞* TODO 是否需要使用业务线程池,线程池的数量该怎么确定* private static ...
  • 1. 什么是SSLSocketJDK文档指出,SSLSocket扩展Socket并提供使用SSL或TLS协议的安全套接字。这种套接字是正常的流套接字,但是它们在基础网络传输协议(如TCP)上添加了安全保护层。具体安全方面的讨论见下一篇。本篇...
  • java SSLContext

    千次阅读 2017-05-01 21:26:41
    java SSLContext 目录(?)[-] 1 什么是SSLSocket2 SSLSocket和相关类3 SSLContext的使用4 SSLSocket和SSLServerSocket的使用 41 SSLServerSocket42 SSLSocket 1. 什么是SSLSocket JDK文档指出,SSL...
  • SSL Context Vertification

    2020-12-09 00:41:23
    ssl.SSLContext(ssl.PROTOCOL_TLSv1)) File "/opt/python/lib/python2.7/urllib2.py", line 154, in urlopen return opener.open(url, data, timeout) File "/opt/python/lib/python2.7/urllib2.py&#...
  • Support external SSLContext

    2020-11-25 23:19:46
    - Is it correct to assume that the <code>SSLContext</code> argument will later be moved to the <code>HTTPConnection</code> abstraction layer?</p><p>该提问来源于开源项目:python-hyper/hyper</p></...
  • Nick/ssl context

    2021-01-08 04:22:40
    <div><p>use SSLContext when using https</p><p>该提问来源于开源项目:elastic/elasticsearch-py</p></div>
  • Add ssl context support

    2021-01-08 08:16:17
    <div><p>Adds the global <code>geopy.geocoders.options.default_ssl_context</code> setting and <code>ssl_context</code> param to each geocoder. <p>By specifying a custom TLS context it's possible to...
  • where I asked for there to be PFS (perfect forward secrecy) in boto3, the response is a feature request to add support for a custom <code>SSLContext</code> to the <code>requests.adapters.HTTPAdapter...
  • Commit c9e7cde8d5bd52e338637a08c76ac284aff44683 change the way the SSLContext.make method worked. However there are duplicate defines for SSL_PROTOCOL_ALL (one in ssl_private.h, one in SSL.java) and ...
  • public Config sslContext(javax.net.ssl.SSLContext sslContext) {...} </code></pre> <p>With this option you will enable the consumer of the library to provide any kind of ssl/tls stategy. Like one way ...
  • 1 SSLContext类介绍 ssl库中除了提供SSLSocket类以外,还提供了SSLContext类。相比于SSLSocket类,SSLContext提供了丰富的属性,供我们修改和查看SSL握手时的参数。 我们可以通过以下命令来实例化SSLContext实例...
  • Fixed typo in SSLContext

    2020-11-25 10:08:16
    <div><p>In <code>hyper.ssl_compat.SSLContext#load_cert_chain, the reference to <code>self._ctx.set_password_cb</code> should be <code>self._ctx.set_passwd_cb</code>. Added <code>test/test_hyper_SSL...
  • 正如您在standard names documentation中看到的,所有条目(SSLv3,TLSv1.0,TLSv1.1,…)都表示它们可能支持...如果查看source code,则TLS10Context类用于TLS,SSL,SSLv3和TLS10,TLS11Context用于TLSv1.1,TLS12Context...
  • SSLContext.dup is broken

    2020-12-09 09:28:27
    OpenSSL::SSL::SSLContext.new.dup NoMethodError: undefined method `initialize_copy' for #<:ssl::sslcontext:0x00007ffc4e37c330> from (pry):2:in `initialize_dup' ^_^ > gem list...
  • <p>In some case, a server can start with a misconfigured <code>SslContext</code> and fail when the serving its first request. If a server refuses to start in such a case, users could fix their ...
  • <p>Would it be possible to provide additional Options for the SSL Context like verify_peer, ca_file and ca_path mentioned in http://php.net/manual/de/context.ssl.php. Currently I have some problems to...
  • Error Creating SSL context.

    2020-12-27 17:36:01
    <div><p>When I try to download a parameters file in MP2.0 I get a ...Could not create ssl context". <p>Any ideas why that may be?</p><p>该提问来源于开源项目:ArduPilot/apm_planner</p></div>
  • ssl.cpp:162: SslContext_t::SslContext_t(bool, const std::string&, const std::string&): Assertion `e > 0' failed. </code></pre> <p>Wouldn't it be better to raise a real ruby ...
  • <div><p>Use SSLContext objects, if available, since this provides more options and features including SNI (#11). Also, allows default system context from <code>ssl.create_default_context()</code> to ...
  • old_sslcontext_wrap_socket = ssl.SSLContext.wrap_socket AttributeError: 'module' object has no attribute 'SSLContext <p>Can you guys publish some release notes so we know if this is ...
  • (Expected kind of OpenSSL::SSL::SSLContext) /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:577:in `initialize' (also on linux). <p>This was introduced in...
  • container | super(SSLContext, SSLContext).options.__set__(self, value) container | [Previous line repeated 481 more times] container | RecursionError: maximum recursion depth exceeded </code></pre>...
  • 先了解几个关键类 SSLContext 安全套接字协议的实现核心类 SSLSocket 扩展自Socket用户客户端 SSLSocketFactory 工厂类 SSLServerSocket 扩展自ServerSocket用于服务端 SSLServerSocketFactory S...
  • SSLContext" only works with python >= 2.7.9. There is no need to use it when python version lower.</p><p>该提问来源于开源项目:vmware/pyvmomi-community-samples</p></div>

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,531
精华内容 2,612
关键字:

sslcontext