GVKun编程网logo

找不到sun.security.ssl.SSLSessionImpl(找不到人报警有用吗)

9

本文将介绍找不到sun.security.ssl.SSLSessionImpl的详细情况,特别是关于找不到人报警有用吗的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同

本文将介绍找不到sun.security.ssl.SSLSessionImpl的详细情况,特别是关于找不到人报警有用吗的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于2537-springsecurity系列--关于session的管理2-session缓存和共享、Access denied (403) see security.limit_extensions、Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)、asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?的知识。

本文目录一览:

找不到sun.security.ssl.SSLSessionImpl(找不到人报警有用吗)

找不到sun.security.ssl.SSLSessionImpl(找不到人报警有用吗)

当我尝试使用okhttpjavax.ws.rs.client.Client发生以下错误时

java.lang.NoSuchMethodError:sun.security.ssl.SSLSessionImpl。(Lsun / security
/ ssl / ProtocolVersion; Lsun / security / ssl / CipherSuite; Ljava / util /
Collection; Lsun / security / ssl / SessionId; Ljava / lang / String ; I)V

在sun.security.ssl包中搜索,没有SSLSessionImpl类

我正在使用Mac OS 10.13.3(17D102)

java -versionjava version "1.8.0_162"Java(TM) SE Runtime Environment (build 1.8.0_162-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

在Glassfish 5.0上展开战争

build.gradle

buildscript {    ext.kotlin_version = ''1.2.30''    repositories {        mavenCentral()    }    dependencies {        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"    }}group ''invoice-administration-api''version ''1.0-SNAPSHOT''apply plugin: ''idea''apply plugin: ''war''apply plugin: ''kotlin''apply plugin: ''kotlin-jpa''apply plugin: ''kotlin-allopen''repositories {    mavenCentral()}dependencies {    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"    compileOnly group: ''javax'', name: ''javaee-api'', version: ''8.0''    compile group: ''org.hibernate'', name: ''hibernate-core'', version: ''5.2.13.Final''    compile group: ''org.glassfish.jersey.media'', name: ''jersey-media-json-jackson'', version: ''2.26''}allOpen {    annotation(''javax.ejb.Stateless'')}compileKotlin {    kotlinOptions.jvmTarget = "1.8"}compileTestKotlin {    kotlinOptions.jvmTarget = "1.8"}

答案1

小编典典

编辑:由于这是“正确答案”,因此Java 1.8.0-151将可能缺少安全补丁。我不建议降级到这样的旧Java版本。

请查看Payara项目或Glassfish的新版本。

-

尝试将Java版本降级为Java 1.8.0-151。它应该工作。

我昨天(3月19日)检查了Java 8的glassfish
5中存在一个问题,创建了一个问题,但是关于该问题的夜间构建没有任何更改。

2537-springsecurity系列--关于session的管理2-session缓存和共享

2537-springsecurity系列--关于session的管理2-session缓存和共享

版本信息


<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.14.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>1.5.14.RELEASE</version>
    <!--实际里面spring-security-web的版本是4.2.7-->
</dependency>




需求

1.服务器重启后,用户不需要重新登录,进行session缓存
2.用户登录后,半小时内无操作,则将其session置为无效
3.多台服务器部署成应用集群,进行session共享
4.想自定义前端cookie的名称,不用用自定义的JSESSION名称

处理需求

需求1

SpringSession和SpringSecurity可自动配合,SpringSecurity会向SpringSession获取session信息和授权信息,并进行缓存,
在应用重启后,SpringSecurity获取到的是Redis中缓存的session信息,即可完成重启后不重复登录

需求2

配置server.session.timeout参数,单位是秒,最小值是一分钟即60秒,假设server.session.timeout=60,用户在登录后,会在redis存一条session信息
如果60秒内没有任何操作,该条session将失效。如果用户一直有操作和请求,SpringSession会刷新有效期,每次请求后都将重新计算60秒。

需求3

应用在配置时,公用一台Redis服务器即可,所有应用的SpringSecurity都会通过SpringSession来存取session,而SpringSession都指向同一台Redis服务器,即可达到session共享的效果

需求4

自定义一个CookieHttpSessionStrategy即可
    @Bean
    public CookieHttpSessionStrategy cookieHttpSessionStrategy() {
        CookieHttpSessionStrategy strategy = new CookieHttpSessionStrategy();
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        cookieSerializer.setCookieName("gs");
        cookieSerializer.setCookiePath("/");
        cookieSerializer.setCookieMaxAge(60 * 60 * 24 * 30);
        strategy.setCookieSerializer(cookieSerializer);
        return strategy;
    }

使用spring-session组件来管理web应用的session

依赖文件


springboot的版本
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.14.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


redis依赖和springsession的依赖

        <!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <exclusion>
                    <!--spring2.0以后默认的客户端是lettuce 需要手动指定成redis-->
                    <groupId>redis.clients</groupId>
                    <artifactId>jedis</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!--redis依赖-->

        <!--springsession的依赖-->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session</artifactId>
            <version>1.3.1.RELEASE</version>
        </dependency>
        <!--springsession的依赖-->

配置application.properties的配置文件

# spring session采用的数据源类型
spring.session.store-type=redis
#配置session在redis里的命名空间
#spring.session.redis.namespace=security_session
#配置session的保存触发方式
#spring.session.redis.flush-mode=on_save
# 应用的session过期时间
server.session.timeout=1800

redis配置参数


#The  Redis settings
# Redis数据库索引(默认为0)
spring.redis.database=9
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0

Redis初始化类


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import redis.clients.jedis.JedisPoolConfig;

@Configuration
@EnableAutoConfiguration
public class RedisConfig {

    private static Logger logger = LoggerFactory.getLogger(RedisConfig.class);

    @Bean
    @ConfigurationProperties(prefix = "spring.redis")
    public JedisPoolConfig getRedisConfig() {
        JedisPoolConfig config = new JedisPoolConfig();
        return config;
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.redis")
    public JedisConnectionFactory getConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        JedisPoolConfig config = getRedisConfig();
        factory.setPoolConfig(config);
        logger.info("JedisConnectionFactory bean init success.");
        return factory;
    }


    @Bean
    public RedisTemplate<?, ?> getRedisTemplate() {
        RedisTemplate<?, ?> template = new StringRedisTemplate(getConnectionFactory());
        return template;
    }
}

踩得坑

  1. springboot 2.0以上的版本和 1.3版本的SpringSession在兼容上有些问题
  2. 1.3版本的SpringSession可正常使用Redis进行session缓存,1.3版本的SpringSession在使用MongoDB时,会出现数据格式不兼容(存进去的数据和取出的数据不同,导致报错)

参考和官方文档:

https://docs.spring.io/spring-session/docs/current/reference/html5/guides/java-security.html 官方文档 使用spring-session来给sec提供session缓存支持

https://docs.spring.io/spring-session-data-mongodb/docs/2.0.2.RELEASE/reference/htmlsingle/boot-mongo.html Spring Session - Mongo Repositories

https://docs.spring.io/spring-session-data-mongodb/docs/2.0.2.RELEASE/reference/htmlsingle/ 使用mongodb管理session的文档

https://docs.spring.io/spring-session/docs/1.3.3.RELEASE/reference/html5/ spring-session1.3.3的文档 里面详细说明和demo(1.3.3操作redis的客户端换成了 Lettuce)

完整项目工程参考

https://github.com/starmoon1994/springsecurity-collection

Access denied (403) see security.limit_extensions

Access denied (403) see security.limit_extensions

1.在centOS7.4下使用oneinstack安装lnmp环境,访问的时候php的时候报 Access denied (403) see security.limit_extensions 。百度之后发现是限制了访问后缀,具体解决如下:

  1. 在你php-fpm配置文件php-fpm.conf中设置security.limit_extensions 为 .php 或 .php5,或者其他任何与你环境一致的后缀名。 对于开发环境下的一些用户来说, 完全移除所有security.limit_extensions的值或设置为FALSE,能够保证可以正常工作.
  2. 在你的nginx配置文件中设置fastcgi_pass 为你的socket地址(e.g. unix:/var/run/php-fpm/php-fpm.sock;), 替代ip地址:端口这种方式(127.0.0.1:9000).
  3. 检查你的SCRIPT_FILENAME, fastcgi_param 并根据你文件的地址来设置它们.
  4. 在你的nginx配置文件中包含有fastcgi_split_path_info ^(.+\.php)(/.+)$; 则所有其他的对应fastcgi参数也都应该在location块中定义;具体可参考phalcon的nginx官方配置
  5. 在你的php.ini配置文件中,设置cgi.fix_pathinfo=1

2.查看php.ini发现 cgi.fix_pathinfo=0,改为1之后重启php-fpm就好了。

Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)

Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)

Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)

要:

    Java Security在Java存在已久了而且它是一个非常重要且独立的版块,包含了很多的知识点,常见的有MD5,DigitalSignature等,而Android在Java Seurity之外,拓展了一个android.security包,此包中就提供了KeyChain。它包含了主要三个重要的规范:JavaCryptography Extension(简写为JCE),JCE所包含的内容有加解密,密钥交换,消息摘要(Message Digest,比如MD5等),密钥管理等。本文所涉及的大部分内容都属于JSSE的范畴,JSSE所包含的内容就是Java层的SSL/TLS。简单点说,使用JSSE就可以创建SSL/TLS socket了。JavaAuthentication and Authorization Service(简写为JAAS),JSSA和认证/授权有关,这部分内容在客户端接触得会比较少一点。

    在上述三个子模块或规范中,JCE是JavaSecurity的大头,其他两个子模块JSSE和JAAS都依赖于它,比如SSL/TLS在工作过程中需要使用密钥对数据进行加解密,那么密钥的创建和使用就依靠JCE子模块了。但是本篇将主要JSSE版块中的SSL/TLS协议,重点关注SSL/TLS协议的安全性以及通信细节详解,同时就Android或Java程序中对此应用对比并加以辅助说明。

 

 

一 : 简介

    SSL (Secure Socket Layer)即:安全套接字层, 它是由Netscape 所研发,用以保障在 Web的安全传输协议,目的是为网络通信提供机密性、认证性及数据完整性保障,利用数据加密 (Encryption) 技术,可确保数据在网络上之传输过程中不会被截取及窃听。它已被广泛地用于 Web 浏览器与服务器之间的身份认证和加密数据传输。 SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。先今,SSL已经成为互联网保密通信的工业标准。

 

    SSL最初的几个版本(SSL 1.0、SSL2.0、SSL 3.0)由网景公司设计和维护,从3.1版本开始,SSL协议由因特网工程任务小组(IETF)正式接管,并更名为TLS(Transport Layer Security),发展至今已有TLS 1.0、TLS1.1、TLS1.2这几个版本。

 

  如TLS名字所说,SSL/TLS协议仅保障传输层安全。同时,由于协议自身特性(数字证书机制),SSL/TLS不能被用于保护多跳(multi-hop)端到端通信,而只能保护点到点通信。

 

  SSL/TLS协议能够提供的安全目标主要包括如下几个:

 

  认证性——借助数字证书认证服务器端和客户端身份,防止身份伪造,确保数据发送到正确的 客户机和服务器

 

  机密性——借助加密防止第三方窃听

 

  完整性——借助消息认证码(MAC)保障数据完整性,防止消息篡改

 

  重放保护——通过使用隐式序列号防止重放攻击

 

  为了实现这些安全目标,SSL/TLS协议被设计为一个两阶段协议,分为握手阶段和应用阶段:

 

  握手阶段也称协商阶段,在这一阶段,客户端和服务器端会认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及MasterSecret。后续通信使用的所有密钥都是通过MasterSecret生成。

 

  在握手阶段完成后,进入应用阶段。在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

 

       SSL/TLS协议有一个高度模块化的架构,分为很多子协议,如下图所示:


  Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换;

  ChangeCipherSpec 协议:一条消息表明握手协议已经完成;

  Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告;

  Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。

 

 

二:SSL/TSL协议流程

    SSL/TSL协议可以分为以下两种类型:

1>.单向认证

    客户端和服务器端只存单方面认证 即:客户端需要服务器端的证书认证,而服务端则不需要客户端证书认证。起先,客户端会发送一条打招呼信息里面携带了版本、加密体系、压缩算法等等相关信息,服务端收到后,向客户端确认选择的版本、加密体系等等信息。随后服务端会将自己的证书包含了公钥等信息发给客户端,客户端在取得服务器端的公钥,将会对要发送的数据进行加密,并发送给服务器。服务器端收到后,会用本地私钥对收到的客户端加密数据进行解密。然后,通信两边都应用这些数据来产生两边之间通信的加密密钥。接下来,两边就可以开始通信过程了。

 

2>.双向认证

    双向认证和单向基本类似,只不过多个几个认证环节。既然是双向认证,也就意味着服务端也需要获取client端证书从而取得客户端的公钥。随后客户端会发送一条用自己私钥加密的数据给服务端,服务端收到后就会用其获得的公钥进行解密认证。其它环节都跟单向一样咯。

 

  下图是一个典型的TLS 1.0协议交互流程如下图所示:

 

   

    每一个SSL/TLS链接都是从握手开始的,握手过程包含一个消息序列,用以协商安全参数、密码套件,进行身份认证以及密钥交换。握手过程中的消息必须严格按照预先定义的顺序发生,否则就会带来潜在的安全威胁。

 

    ClientSayHi:首先client端发出这样的一个消息,此消息中携带了客户端所支持的密码套件列表、最高SSL/TLS协议版本列表、加密算法种类列表以及压缩算法等等服务器和客户端之间通讯所需要的各种信息。


    此外ClientSayHi中还包含一个随机数,这个随机数由4个字节的当前GMT UNIX时间以及28个随机选择的字节组成,共32字节。该随机数会在服务器端公钥生成过程中被使用。ClientSayHi中还可能包含客户端支持的TLS扩展。(TLS扩展可以被用来丰富TLS协议的功能或者增强协议的安全性)


    ServerSayHi:服务器接受到后,会返回ServerSayHi消息。服务器从客户端在ClientSayHi消息中提供的密码套件、SSL/TLS版本、加密算法等列表里选择它所支持的项,并把它的选择包含在ServerSayHi中告知客户端。接下来SSL协议的建立就基于服务器选择的密码套件类型、SSL/TLS协议版本以及加密算法。ServerSayHi中同样会包含一个随机数,同样4+28 字节类型,由服务器生成。


  Certificate:客户端和服务器都可以发送证书消息来证明自己的身份,但是通常客户端证书不被使用。 服务器一般在ServerSayHi后会接着发一条Certificate消息,该证书则包含了数据加密算法种类、server端的产生的随机数以及公钥等等信息,客户利用服务器传过来的证书提取相关的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的 “ 发行者的数字签名 ” ,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开; 目前主流的证书通用格式则是X509证书格式,在用的X.509证书包含Version 1和Version 3两种版本,其中v1版本的证书存在安全隐患,同时不支持TLS扩展,被逐渐弃用。现在大多数在用的SSL证书都是V3版本。同时证书会附带与协商好的密钥交换算法对应的密钥。


  ServerKeyExchange:该消息仅当以下加密算法被使用时由服务器发出(也就是会说当server端在client端提供的加密算法列表里选择以下列出的算法之一,接下来server端就会继续发送一条ServerKeyExchange信息):  RSA_EXPORT(仅当服务器的公钥大于512bit时)、DHE_DSS、DHE_DSS_EXPORT、DHE_RSA、DHE_RSA_EXPORT、DH_anon 使用其它密钥交换算法时,服务器不能发送此消息。ServerkeyExchange消息会携带对应加密算法所需要的额外参数信息,以后这些信息在client端会进一步升级与servery端约定的加密算法。同时这些参数需要被签过名。


  CertificateRequest:这个消息通常在要求认证客户端身份时才会有也就是双向认证。消息中包含了证书类型以及可接受的CA列表。

  ServerSayHiDone:服务器发送这条消息表明服务器部分的密钥交换信息已经发送完了,等待客户端的消息以继续接下来的步骤。这条消息只用作提醒,不包含数据域。


  ClientKeyExchange:这条消息包含的数据与所选用的密钥交换算法有关。 在此之前客户端会随机产生一个用于后面通讯的 “ 对称密码 “也就是临时秘钥(key),它有48个字节,前2个字节表示客户端支持的最高协议版本,后46个字节是随机选择的。该秘钥和client端公钥同时调用包含在之前证书中的或者是ServerKeyExchange中的传过来的server端公钥进行加密,接着就会随着ClientKeyExchange这条消息发送给服务器,服务器将用自己持有的私钥来解密该"对称密码",这将作为两者以后通信中的数据加密算法,保证数据传输的安全性。如果选择的密钥交换算法是DH或者DHE,则可能有两种情况:隐式DH公开值:包含在Certificate消息里; 显示DH公开值:公开值是本消息的一部分。


  CertificateVerify:这条消息用来证明客户端拥有之前提交的客户端证书的私钥,当使用了双向认证的时候,这条消息将会携带一条客户端用自己的私钥生产一个数字,服务器收到这条数据后,会将之前收到客户端的公钥进行解密验证。

 

 ChangeCipherSpec 协议:client端接着发一条该消息表明握手协议已经完成同时也切换到了加密模式了;


  Finished:表明握手阶段结束。这是第一条用协商的算法和密钥保护的消息。因为是用协商好的密钥加密的消息,它可以用来确认已经协商好的密钥。同时Finished消息包含一个verify_data域,可以用来校验之前发送和接收的信息。 Verify_data域是一个PRF函数的输出(pseudo-random function)。这个伪随机函数的输入为:(1)两个hash值:一个SHA-1,一个MD5,对之前握手过程中交换的所有消息做加密哈希功能(消息摘要),在这里server就可以根据数据的哈希值和MD5值进行验证传输数据的完整性;(2)the MasterSecret,由预备主密钥生成。

 

    服务器端收到client端ChangeCipherSpec 和Finished消息之后,接着也会发送一条ChangeCipherSpec 消息表面服务器端也切换到了加密模式,握手协议到此结束了。同时也会接着发一条Finished表明已经收到了client 端的Finished请求正式结束握手。此外,Finished 消息不能够在ChangeCipherSpec前发送。

 

    我们不难发现在SSL/TSL通信协议其实就是两种算法的使用:对称加密和非对称加密。在协议握手环节双方获取彼此的公钥解析数据从而产生和获取接下来的通信秘钥这里就是一个非对称加密过程。接下来使用产生的通信秘钥进行解密通信数据,这就是一个对称加密的过程。

 

    除此之外,以下几个名词我们也需要了解:

 

Key:属于JCE的范畴,可分为对称key和非对称key。对称key就是接下来的通信双方用来加密数据的秘钥,非对称key就是公钥和私钥了。其内部表示形式就是一个类,其外部表示形式就 是一个比特(bit)字符串,key就是用来参与加密解密数据的,就像是一把开锁的钥匙。

对称加密(symmetric cryptography):就是须要两边应用一样的 key 来加密解密消息算法,常用密钥算法有 Data Encryption Standard(DES)、triple-strength DES(3DES)、Rivest Cipher 2 (RC2)和 Rivest Cipher 4(RC4)。因为对称算法效力相对较高,是以 SSL 会话中的敏感数据都用经由过程密钥算法加密。

非对称加密(asymmetric cryptography):就是 key 的构成是公钥私钥对 (key-pair),公钥传递给对方私钥本身保存。公钥私钥算法是互逆的,一个用来加密,另一个可以解密。常用的算法有 Rivest Shamir Adleman(RSA)、Diffie-Hellman(DH)。非对称算法策画量大斗劲慢,是以仅实用于少量数据加密,如对密钥加密,而不合适多量数据的通信加密。

加密哈希功能(Cryptographic Hash Functions): 加密哈希功能与 checksum 功能相类似。区别在于,checksum 用来侦测不测的数据变更而前者用来侦测有心的数据批改。数据被哈希后产生一小串比特字符串,渺小的数据改变将导致哈希串的变更。发送加密数据时,SSL 会应用加密哈希功能来确保数据一致性,用来阻拦第三方破损通信数据完全性。SSL 常用的哈希算法有 Message Digest 5(MD5)和 Secure Hash Algorithm(SHA)。

消息认证码(Message Authentication Code): 消息认证码与加密哈希功能相类似,在哈希加密机基础上它须要将密钥信息与加密哈希功能产生的数据连络就是哈希消息认证码(HMAC)。若是 A 要确保给 B 发的消息不被 C 批改,他要按如下步调做 --A 起首要生成一个 HMAC值;,将其添加到原始消息后面。用 A 与 B 之间通信的密钥加密消息体,然后发送给 B。B 收到消息后用密钥解密,然后就通信数据重新创建一个 HMAC值,将前后两个值进行对比来断定消息是否在传输中被批改。

数字(Digital Signature):一个消息的加密哈希被创建后,哈希值用发送者的私钥加密,加密的成果就是叫做数字。

 

三:实际应用说明

  这个案例分两个部分,一个是服务端,另外一个是客户端。服务端打印出接收到的客户端数据,即打印客户端发来的一个字符串。

   server端:

复制代码

void initServer(){
              
               try {
                      //获取ssl协议的安全环境,或者TLS
                     SSLContext sContext = SSLContext. getInstance("SSL");
                     
            //获取jks算法格式的秘钥存储器-常见的有JKS, JCEKS,and PKCS12。其中功能比较全的是JCEKS                   
                     KeyStore store = KeyStore. getInstance("JKS");
                     
                     AssetManager manager = mContext.getAssets();
                     
                     InputStream is = manager.open( "test_key_store");
                     
                     
                      //将证书导入到秘钥存储器中,同时给其配置一个打开密码。有时候我们需要有不同类型的秘钥需要多个秘钥存储器来存储
                      store.load( is, "kevin".toCharArray());
                     
                      is.close();
                     
                      //为了管理多个或多种秘钥存储器,这里引入了一秘钥管理器这个概念,就是专门管理多个或多种秘钥存储器
                     KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory. getDefaultAlgorithm());
                     
                     
                      //给每个秘钥管理器的安置的秘钥存储器配置一个获取密码
                      factory.init( store, "123456".toCharArray());
                     
                      /**
                      * 初始化 ssl协议安全环境。 init函数有三个参数,第一个是KeyManager数组,server端需要用它里面的保存的私钥来签名证书
                   * 第二个是TrustManager数组,第三个是SecureRandom,用来创建随机数的
                      * 对于server端而言,它不需要验证客户端证书,所以很显然第一个参数用来创建服务端Socket的,而第二个参数用于创建客户端Socket(也可以都不填)
                      */
                      sContext.init( factory.getKeyManagers(), null, null );
                     
                     
                      //以下就是配置 ip和端口来链接
                     InetAddress address = Inet4Address. getLocalHost();
                     
                     SSLServerSocket serverSocket = (SSLServerSocket) sContext.getServerSocketFactory().createServerSocket(8666,1,address);
                     
                     Socket socket = serverSocket.accept();
                     
                     InputStream in = socket.getInputStream();
                     
                      byte[] data = new byte[1024];
                     
                      int count = in .read(data );
                     
                     Log. i("TAG", "DATA:"+new String(data , 0, count ));
                     
                      in.close();
                     
                      socket.close();
                     
                      serverSocket.close();
                     
              } catch (NoSuchAlgorithmException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (KeyStoreException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (CertificateException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (IOException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (UnrecoverableKeyException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (KeyManagementException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              }
              
       }

复制代码

client端:

复制代码

void initClient(){
               try {
                      //获取ssl协议的安全环境
                     SSLContext sContext = SSLContext. getInstance("SSL");
                     
            //获取BKS算法格式的秘钥存储器-Android中通用的格式 
                     KeyStore store = KeyStore. getInstance("BKS");
                     
                     AssetManager manager = mContext.getAssets();
                     
                      //这里是使用Java自带的工具 keytool创建的一个证书放在工程assert文件中
                     InputStream is = manager.open( "test_key_store");
                     
                     
                      //将证书导入到秘钥存储器中,同时给其配置一个打开密码。有时候我们需要有不同类型的秘钥需要多个秘钥存储器来存储
                      store.load( is, "kevin".toCharArray());
                     
                      is.close();
                     
                     
                     TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory. getDefaultAlgorithm());
                     
                     
                      //初始化trustManagerFactory也就是将证书内容导入进去
                      trustManagerFactory.init(store );
                     
                      /**
                      * 初始化 ssl协议安全环境。 init函数有三个参数,第一个是KeyManager数组,
                   * 第二个是TrustManager数组,第三个是SecureRandom,用来创建随机数的
                      * 对于client端而言,它需要验证服务端证书,所以只需要可以去而第二个参数(也可以都不填)
                      */
                      sContext.init( null, trustManagerFactory .getTrustManagers(), null);
                     
                     
                      //以下就是配置 ip和端口来链接
                     InetAddress address = Inet4Address. getLocalHost();
                     
                     SSLSocket socket = (SSLSocket) sContext.getSocketFactory().createSocket(address ,8666);
                     
                     OutputStream out = socket.getOutputStream();
                     
                     String data = "hello i'm spencer but you can call me kevin" ;
                     
                      out.write( data.getBytes());
                     
                      out.close();
                     
                      socket.close();
                     
              } catch (NoSuchAlgorithmException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (KeyStoreException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (CertificateException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (IOException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              } catch (KeyManagementException e ) {
                      // TODO Auto-generated catch block
                      e.printStackTrace();
              }
              
       }

复制代码

 

四:小结

 

    JSSE介绍就到此为止。有关JCE的内容以后有时间会给他整理出来,以上有哪里描述不对的或者有疑问的可以说出来一起探讨探讨!

posted @ 2015-06-15 23:36 laughingQing 阅读(...) 评论(...) 编辑 收藏

asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?

asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?

从.NET 3.5升级某些ASP.NET代码时,我收到以下编译警告作为错误:
‘System.Security.Permissions.SecurityAction.RequestMinimum’已经过时了.

该属性具有应用于assebly级别的蜜蜂:

[assembly: System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.RequestMinimum,Execution=true)]

此外,该代码也利用了P& P Web Client Software Factory,特别是ObjectBuilder.WCSFExtensions库.
代码也提供了一些角色提供者的实现.

请记住,此代码用作其他项目中的框架代码,因此很难确定可能存在的安全需求.

所以极限的问题是:

什么值需要用于“System.Security.Permissions.SecurityAction”枚举?

或者,是否有更好的方法来应用此安全属性?

解决方法

您是否阅读完整的编译器警告或访问其包含的链接? “裸”CLR不再限制在.NET 4.0下的CAS权限,除非您翻转“传统模式”开关,因此您的RequestMinimum使用没有替代.程序集级SecurityPermissionAttribute应该被删除,不被修改.

有关MSDN上显示的4.0 CAS更改的更完整的说明,请参阅http://blogs.msdn.com/b/shawnfa/archive/2009/05/21/security-policy-in-the-v4-clr.aspx和http://blogs.msdn.com/b/shawnfa/archive/2010/02/24/so-is-cas-dead-in-net-4-or-what.aspx.

关于找不到sun.security.ssl.SSLSessionImpl找不到人报警有用吗的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于2537-springsecurity系列--关于session的管理2-session缓存和共享、Access denied (403) see security.limit_extensions、Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)、asp.net – 如何修复“System.Security.Permissions.SecurityAction.RequestMinimum”是过时的“编译错误?的相关知识,请在本站寻找。

本文标签: