精华内容
下载资源
问答
  • 双向HTTP连接-源码

    2021-04-08 12:43:12
    有关使用单个开放式连接的双向通信的文章。
  • VC http/https(包含单向认证、双向认证源码、SSL协议设置) 这个类是从我现在正在开发的代码中扣出来的,但是耦合性应该不高,可以加入到其他工程使用,带S的函数是针对多线程压力测试几乎没有捕获异常。代码以先...
  • NULL 博文链接:https://linuxbai.iteye.com/blog/456802
  • https双向加密认证

    2018-10-24 22:44:50
    HTTPS:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。 http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的...

    一、背景&概念

    HTTPS:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议。 http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层。从发送端看,这一层负责把http的内容加密后送到下层 的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容。

    SSL(Secure Socket Layer):是Netscape公司设计的主要用于WEB的安全传输协议。从名字就可以看出它在https协议栈中负责实现上面提到的加密层。因此,一个https协议栈大致是这样的:

    数字证书:一种文件的名称,好比一个机构或人的签名,能够证明这个机构或人的真实性。其中包含的信息,用于实现上述功能。

    加密和认证:加密是指通信双方为了防止铭感信息在信道上被第三方窃听而泄漏,将明文通过加密变成密文,如果第三方无法解密的话,就算他获得密文也无能为力;认证是指通信双方为了确认对方是值得信任的消息发送或接受方,而不是使用假身份的非法者,采取的确认身份的方式。只有同时进行了加密和认证才能保证通信的安全,因此在SSL通信协议中这两者都被应。早期一般是用对称加密算法,现在一般都是不对称加密,最常见的算法就是RSA。

    消息摘要:这个技术主要是为了避免消息被篡改。消息摘要是把一段信息,通过某种算法,得出一串字符串。这个字符串就是消息的摘要。如果消息被篡改(发生了变化),那么摘要也一定会发生变化(如果2个不同的消息生成的摘要是一样的,那么这就叫发生了碰撞)。

    消息摘要的算法主要有MD5和SHA,在证书领域,一般都是用SHA(安全哈希算法)。

    数字证书、加密和认证、消息摘要三个技术结合起来,就是在HTTPS中广泛应用的证书(certificate),证书本身携带了加密/解密的信息,并且可以标识自己的身份,也自带消息摘要。

    HTTPS认证过程:

    ① 浏览器发送一个连接请求给安全服务器。

    ② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。

    ③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。

    ④ 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。

    ⑤ 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。

    ⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。

    ⑦ 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。

    ⑧ 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。

    ⑨ 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。

    ⑩ 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。

    上面所述的是双向认证 SSL 协议的具体通讯过程,这种情况要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有 CA 证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的 (这并不影响 SSL 过程的安全性)密码方案。这样,双方具体的通讯内容,就是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密 的数据进行解密,这时候的安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够的安全。这也是我们强调要求使用128 位加密通讯的原因。

    二、环境准备

    Oracle Linux Server release 6.5、JDK1.7.0_45、openssl-1.0.2d

    三、单向认证

    3.1 为服务器生成证书

    keytool -genkey -keyalg RSA -dname "cn=127.0.0.1,ou=inspur,o=none,l=shandong,st=jinan,c=cn" -alias server -keypass 111111 -keystore server.keystore -storepass 111111 -validity 3650

    注:cn=127.0.0.1配置的是服务器IP

    3.2 生成csr

    生成csr文件用于提交CA认证生成证书使用。

    keytool -certReq -alias server -keystore server.keystore -file ca.csr

    3.3 生成cer

    这个ca.cer是为了解决不信任时要导入的

    keytool -export -alias server -keystore server.keystore -file ca.cer -storepass 111111

    3.4 tomcat配置ssl

    clientAuth="false"代表单向认证,配置如下:

    <Connector SSLEnabled="true" clientAuth="false"

            maxThreads="150" port="8443"

            protocol="org.apache.coyote.http11.Http11Protocol"或者HTTP/1.1

            scheme="https" secure="true" sslProtocol="TLS"

            keystoreFile="D:/server.keystore" keystorePass="111111"/>

    注: Http11Protocol支持HTTP/1.1协议,是http1.1协议的ProtocolHandler实现。

    3.5 解决不信任

    启动tomcat,输入 https://127.0.0.1:8443/

    这时提示框显示:服务器的证书不受信任。在浏览器内显示以下提示:

    此服务器无法证明它是127.0.0.1;您计算机的操作系统不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。

    选择“继续前往(不安全)”,也能访问,但是此时就是以普通的HTTP方式进行信息传输了。

     

    选择安装步骤3.3生成的ca.cer文件,将证书存储在“受信任的证书颁发机构”,就可以通过HTTPS正常访问了。

     

    3.6 解决程序访问异常

    这时候如果用程序去访问可能还会抛证书不信任的异常sun.security.validator.ValidatorException: PKIX path building failed...

    需要将生成的证书(ca.cer ) 导入到jdk中

    执行以下命令:

    keytool -import -alias tomcatsso -file "ca.cer" -keystore "D:\java\jdk1.6.0_11\jre\lib\security\cacerts" -storepass changeit

    其中changeit是jre默认的密码。

    如果抛 No subject alternative names present,请在生成keystore 注意CN必须要为域名(或机器名称)例如localhost 不能为IP 。

    如果抛 No name matching localhost found,表示你生成keystore CN的名称和你访问的名称不一致。

    四、双向认证

    4.1 目录建立

    Linux环境下,在home下建立out32dll目录,在此目录下建立ca、client、server三个文件夹。以下命令均在out32dll目录下执行。

    4.2 生成CA证书

    1. 创建私钥 :

    openssl genrsa -out ca/ca-key.pem 1024

    1. 创建证书请求 :

    openssl req -new -out ca/ca-req.csr -key ca/ca-key.pem

    -----

    Country Name (2 letter code) [AU]:cn 
    State or Province Name (full name) [Some-State]:beijing
    Locality Name (eg, city) []:fengtai
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY 
    Organizational Unit Name (eg, section) []:0953
    Common Name (eg, YOUR name) []:CA
    Email Address []:20095335@mail.besti.edu.cn

    弹出密码输入选项,Enter默认即可

    1. 自签署证书 :

    openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650

    1. 将证书导出成浏览器支持的.p12格式 :

    openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12

    密码:111111

    4.3 生成Server证书

    一.   1.创建私钥 : 
    openssl genrsa -out server/server-key.pem 1024 
    2.创建证书请求 : 
    openssl req -new -out server/server-req.csr -key server/server-key.pem 
    ----- 
    Country Name (2 letter code) [AU]:cn 
    State or Province Name (full name) [Some-State]:beijing 
    Locality Name (eg, city) []:fengtai
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY 
    Organizational Unit Name (eg, section) []:0953
    Common Name (eg, YOUR name) []:222.28.129.224   注意:一定要写服务器所在的ip地址 
    Email Address []:20095335@mail.besti.edu.cn

    弹出密码输入选项,Enter默认即可

    3.自签署证书 : 
    openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650 
    4.将证书导出成浏览器支持的.p12格式 : 
    openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12 
    密码:111111

    4.4 生成Clinet证书

    1. 创建私钥 :

    openssl genrsa -out client/client-key.pem 1024

    1. 创建证书请求 :openssl req -new -out client/client-req.csr -key client/client-key.pem

    -----

    Country Name (2 letter code) [AU]:cn

    State or Province Name (full name) [Some-State]:Beijing

    Locality Name (eg, city) []:fengtai
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:DKY

    Organizational Unit Name (eg, section) []:0953

    Common Name (eg, YOUR name) []:Client

    Email Address []:20095335@mail.besti.edu.cn      

    Please enter the following 'extra' attributes to be sent with your certificate request 
    A challenge password []:123456 
    An optional company name []:tsing 
    3.自签署证书 :

    openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650 
    4.将证书导出成浏览器支持的.p12格式 : 
    openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12 
    密码:111111

    4.5 根据CA证书生成jks文件

    keytool -keystore truststore.jks -keypass 222222 -storepass 222222 -alias ca -import -trustcacerts -file /home/out32dll/ca/ca-cert.pem

    4.6 tomcat配置ssl

    tomcat6.0的配置:修改conf/server.xml。 将keystoreFile、truststoreFile的路径填写为正确的放置路径。如下图:

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

                    maxThreads="150" scheme="https" secure="true"

                    clientAuth="true" sslProtocol="TLS"

                    keystoreFile="server.p12" keystorePass="111111"  keystoreType="PKCS12"

                    truststoreFile="truststore.jks" truststorePass="222222" truststoreType="JKS"/>

    4.7 导入证书

    将ca.p12,client.p12分别导入到IE中去(打开IE->Internet选项->内容->证书)。 ca.p12导入至 受信任的根证书颁发机构,client.p12导入至个人。

    五、浏览器验证

    验证ssl配置是否正确访问你的应用https://服务器ip:8443/,如果配置正确的话,

    单向认证方式会直接跳转到地址,并且https显示绿色。

    双向认证方式会出现请求你数字证书的对话框,选择确定,再跳转到地址,并且https显示绿色。

    六、帮助

    6.1 Tomcat—server.xml—Connector属性

    属性

    说明

    clientAuth

    设置是否双向验证,默认为false,设置为true代表双向验证

    keystoreFile

    服务器证书文件路径

    keystorePass

    服务器证书密码

    truststoreFile

    用来验证客户端证书的根证书,此例中就是服务器证书

    truststorePass

    根证书密码

     

    6.2 keytool

    Keytool是一个Java数据证书的管理工具,Keytool将密钥和证书存在一个称为keystore的文件中。常用命令属性如下:

    命令属性

    说明

    -genkey

    在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书

    -alias

    别名,每个keystore都关联一个唯一的alias,通常不区分大小写

    -keystore

    指定密钥库的名称(产生的各类信息将不在.keystore文件中)

    -keyalg

    指定密钥的算法(如 RSA  DSA(如果不指定默认采用DSA)

    -validity

    指定创建的证书有效期多少天

    -keysize

    指定密钥长度

    -storepass

    指定密钥库的密码(获取keystore信息所需的密码)

    -keypass

    指定别名条目的密码(私钥的密码)

    -dname

    指定证书拥有者信息。例如:"CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=省份名称,C=单位的两字母国家代码"

    -list

    显示密钥库中的证书信息

    -v

    显示密钥库中的证书详细信息

    -export

    将别名指定的证书导出到文件,例:

    keytool   -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码

    -file

    参数指定导出到文件的文件名

    -delete

    删除密钥库中某条目,例:

    keytool -delete -alias 指定需删除的别名 -keystore 指定keystore  -storepass 密码

    -printcert

    查看导出的证书信息,例:keytool   -printcert -file yushan.crt

    -keypasswd

    修改密钥库中指定条目口令,例:

    keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new  新密码  -storepass keystore密码  -keystore

    -import

    将已签名数字证书导入密钥库,例:

    keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书

    6.3 openssl

    http://www.openssl.org/docs/apps/openssl.html

    展开全文
  • C语言实现https客户端,使用证书的双向认证,上传资料中,包含证书和代码,证书使用openssl生成的RSA证书,也可换成自己的证书和服务端一致就行了。
  • http协议是无法实现客户端和服务器的双向通信的,因为他限制了通信请求只能是客户端发给服务器(request),服务器只能给出应答(response)。但是http协议的其中一个特性是请求都是无状态的,也就是说无时间限制。...

    http协议是无法实现客户端和服务器的双向通信的,因为他限制了通信请求只能是客户端发给服务器(request),服务器只能给出应答(response)。但是http协议的其中一个特性是请求都是无状态的,也就是说无时间限制。所以利用这个特性,在需要客户端和服务器双向通信的时候,客户端无论是否有需要,都要向服务器发送request,然后服务器收到request不立即回应(因为客户端暂时没有需要从服务器获取的数据),当服务端需要向客户端主动推送数据时,再利用这个request把要推送的数据response到客户端。客户端收到response后立即再发送一个request去服务端等待推送。

    好麻烦的方法啊,不过至少实现了双向通信。

    展开全文
  • Https是一种认证方式,是在Http协议基础上添加了SSL加密协议,采用https的服务器必须从CA (Certificate Authority)申请一个用于证明服务器用途类型的证书。该证书只有用于对应的服务器的时候,客户端才信任此主机...

    Https 是什么

    Https是一种认证方式,是在Http协议基础上添加了SSL加密协议,采用https的服务器必须从CA (Certificate Authority)申请一个用于证明服务器用途类型的证书。该证书只有用于对应的服务器的时候,客户端才信任此主机。

    Https 长什么样

    你可以使用命令行手段生成一个CA,这种本地CA并没有公信力,但我们学习足够用了
    基于OpenSSL命令行工具,我们可以很方便的创建CA并签发证书,另外一种方式是从CA认证服务商家处,提供信息,由服务商签发证书。
    Https接口方面,还有单向和双向区分,单向证书只需要客户端信任主机,即可正常访问。
    双向认证比较麻烦,需要我们本地也生成一个CA,签发证书交给服务端,服务端认证你的证书。并提供他的证书,最终拿到一个jks文件

    Https 单向 API

    如果想调用Https 单向认证的API,这个好办,我们只需在Java层面,所有证书都选择信任,或加入到java的信任库中
    这里我介绍的是Java调用的方式,添加信任库的方法网上很多。

    废话不说上代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    
    /**
        * 单向Https请求入口
        * @return
        */
       public static String HttpsSingletonGetRequest(String requestUrl, Map<String,String> paramMap) throws Exception{
           StringBuffer resultMsg;
           //封装Client
           CloseableHttpClient httpClient = getSingletonHttpsClient();
           try {
           	//加载URL
               StringBuffer url = new StringBuffer().append(requestUrl);
               //加载参数
               if (!Objects.isNull(paramMap)){
                   for (String key : paramMap.keySet()){
                       url.append("&").append(key).append("=").append(paramMap.get(key));
                   }
               }
    
               String realUrl = url.toString().replaceFirst("&", "?");
               HttpGet httpGet = new HttpGet(realUrl);
               httpGet.addHeader("Content-Type", "application/json;encoding=utf-8");
               CloseableHttpResponse response = httpClient.execute(httpGet);
               //发起请求方法
               resultMsg = send(response);
           } finally {
               httpClient.close();
           }
           return resultMsg == null ? null : resultMsg.toString();
       }
    
    /**
        * 发起请求 相信都熟悉HttpClient这个库,我就不废话了
        * @return
        */
    private static StringBuffer send(CloseableHttpResponse response) throws IOException {
           try {
               StringBuffer resultMsg = null;
               HttpEntity entity = response.getEntity();
               if (entity != null) {
                   resultMsg = new StringBuffer();
                   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
                   String text;
                   while ((text = bufferedReader.readLine()) != null) {
                       resultMsg.append(text);
                   }
               }
    
               EntityUtils.consume(entity);
    
               if (resultMsg == null){
                   throw new RuntimeException("network response error at HttpsClientUtil send()");
               }
               return resultMsg;
           } finally {
               response.close();
           }
       }
    
    /**
        * 核心: 生成Client方法
        * @return
        */
        private static CloseableHttpClient getSingletonHttpsClient() {
        	//首先构建一个注册工厂 用来注册http/https请求
           RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
           ConnectionSocketFactory socketFactory = new PlainConnectionSocketFactory();
           //注册http请求没什么好说的
           registryBuilder.register("http", socketFactory);
           //指定信任密钥存储对象和连接套接字工厂
           try {
           	//实例化一个KeyStore,也就是认证库
               KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
               //信任所有
               TrustStrategy anyTrustStrategy = (x509Certificates, s) -> true;
               //信任所有host
               HostnameVerifier verifier = (s, sslSession) -> true;
               //KeyStore&TrustStrategy加载ssl上下文
               SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore, anyTrustStrategy).build();
               //此方法是生成一个Socket工场,https请求在真实请求接口前,需提前发起Socket请求验证,参数是ssl上下文以及信任所有host的方法
               LayeredConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, verifier);
               //注册Https请求方式
               registryBuilder.register("https", sslSF);
           } catch (KeyStoreException e) {
               throw new RuntimeException(e);
           } catch (KeyManagementException e) {
               throw new RuntimeException(e);
           } catch (NoSuchAlgorithmException e) {
               throw new RuntimeException(e);
           }
    
           Registry<ConnectionSocketFactory> registry = registryBuilder.build();
           //设置连接管理器
           PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);
    
           //返回生成的CloseableHttpClient
           return HttpClientBuilder.create().setConnectionManager(connManager).build();
       }
    

     

    以上我们就可以访问Https单向加密的接口或网址了,比如https://www.baidu.com

    Https 双向 API

    这个相对单向来说,概念上复杂一些,我也并没有完全搞懂,所以概念上的就不聊太多了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    
    //首先我们要初始化一个SSLConnectionSocketFactory
    private static SSLConnectionSocketFactory initConfig() throws Exception {
    	KeyStore keyStore = KeyStore.getInstance("jks");
    	InputStream in = null;
    	try {
    		in = new FileInputStream(TRUST_STORE_FILE);
    		keyStore.load(in, "bld365".toCharArray());
    		SSLContext sslcontext = SSLContexts.custom()
    				.loadTrustMaterial(keyStore, new TrustSelfSignedStrategy())
    				.loadKeyMaterial(keyStore, "bld365".toCharArray())
    				.build();
               HostnameVerifier verifier = (s, sslSession) -> true;
    		return new SSLConnectionSocketFactory(
    				sslcontext,
    				new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"},
    				null,
                       verifier
    				);
    	} catch (Exception e) {
    		e.printStackTrace();
    		throw new Exception("初始化client keyStore 失败:" + e.getMessage());
    	} finally {
    		if (null != in) {
    			in.close();
    		}
    	}
    }
    
    //然后通过initConfig初始化CloseableHttpClient完成请求
    public static String HttpsGetRequest(String requestUrl, Map<String,String> paramMap) throws Exception{
    	StringBuffer resultMsg;
    	CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(initConfig()).build();
    	try {
               StringBuffer url = new StringBuffer().append(requestUrl);
    
               if (!Objects.isNull(paramMap)){
                   for (String key : paramMap.keySet()){
                       url.append("&").append(key).append("=").append(paramMap.get(key));
                   }
               }
    
               String realUrl = url.toString().replaceFirst("&", "?");
               HttpGet httpGet = new HttpGet(realUrl);
    		CloseableHttpResponse response = httpClient.execute(httpGet);
               resultMsg = send(response);
    	} finally {
    		httpClient.close();
    	}
    	return resultMsg == null ? null : resultMsg.toString();
    }
    
    //最后调用send方法发送请求
    private static StringBuffer send(CloseableHttpResponse response) throws IOException {
           try {
               StringBuffer resultMsg = null;
               HttpEntity entity = response.getEntity();
               if (entity != null) {
                   resultMsg = new StringBuffer();
                   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
                   String text;
                   while ((text = bufferedReader.readLine()) != null) {
                       resultMsg.append(text);
                   }
               }
    
               EntityUtils.consume(entity);
    
               if (resultMsg == null){
                   throw new RuntimeException("network response error at HttpsClientUtil send()");
               }
               return resultMsg;
           } finally {
               response.close();
           }
       }
    

    这里我只拿Get请求做了演示,其实Post是一样的,核心操作都在CloseableHttpClient这个对象实例化的过程发生。
    看网上并没有新的解决办法,很多接口都被弃用,甚至是不能用,所以在自己博客里献丑,如果有读者发现有什么不对的话,请点击博客主页Github地址提出Issus,我将不胜感激!

    CSDN是刚转过来的,更多文章会在我的个人[博客](https://radiancel.github.io)

    展开全文
  • httptunnel:在HTTP请求中通过隧道传输的双向数据流
  • VC http/https(包含单向认证、双向认证源码) 这个类是从我现在正在开发的代码中扣出来的,但是耦合性应该不高,可以加入到其他工程使用,带S的函数是针对多线程压力测试几乎没有捕获异常。代码以先完成在完美的思想...
  • 扭曲代理 将HTTP作为python proxy.py -s 8080 -t 127.0.0.1:80运行HTTPS作为python proxy.py -s 4433 -t 127.0.0.1:443
  • HTTP双向认证过程中,每个用户都需要有自己惟一的证书,通过CA的级联证书模式,使所有的证书都对应同一个根证书。这样需要自己生成一套CA根级证书,再借助其生成二级证书作为client证书。此时client私钥签名不仅可以...
  • Android databinding 双向绑定, 效果展示请见:http://blog.csdn.net/Clare_Ju/article/details/52609180
  • 自苹果宣布2017年1月1日开始强制使用https以来,htpps慢慢成为大家讨论的对象之一,不是说此前https没有出现,只是这一决策让得开发者始料未及,博主在15年的时候就做过https的接口,深知此坑之深,原因就是自身对这...
  • 双向通讯

    千次阅读 2019-07-03 13:27:01
    WebSocket 与传统 HTTP 有如下好处。 客户端与服务器端只建立一个 TCP 连接,可以使用更少的连接。 WebSocket 服务器端可以推送数据到客户端,这远比 HTTP 请求响应模式更灵活、更高效。 有更轻量级的协议头,减少...

    WebSocket 与传统 HTTP 有如下好处。

    1. 客户端与服务器端只建立一个 TCP 连接,可以使用更少的连接。
    2. WebSocket 服务器端可以推送数据到客户端,这远比 HTTP 请求响应模式更灵活、更高效。
    3. 有更轻量级的协议头,减少数据传送量。

    WebSocket 最早是作为 HTML5 重要特性而出现的,现代浏览器大多都支持 WebSocket 协议,接下来我们用一段代码来展现 WebSocket 在客户端的应用示例:

    let ws = new WebSocket('ws://localhost:8888')
    ws.onopen = function () {
      console.log('客户端链接成功')
      ws.send('hello')
    }
    ws.onmessage = function (event) {
      console.log('客户端收到服务端的消息', event.data)
    }
    

    上述代码中,浏览器与服务器端创建 WebSocket 协议请求,在请求完成后连接打开,向服务器端发送一次数据,同时可以通过 onmessage() 方法接收服务器端传来的数据。这行为与 TCP 客户端十分相似,相较于 HTTP,它能够双向通信。浏览器一旦能够使用 WebSocket,可以想象应用的使用空间极大。

    在 WebSocket 之前,网页客户端与服务器端进行通信最高效的是 Comet 技术。Comet是一种用于web的推送技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有三种实现方式:轮询(polling) 长轮询(long-polling)和iframe流(streaming)。

    轮询

    轮询是客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。

    这种方式连接数会很多,一个接受,一个发送。而且每次发送请求都会有 Http 的 Header,会很耗流量,也会消耗 CPU 的利用率。

    let express = require('express')
    const app = express()
    const path = require('path')
    
    // 每次请求都立刻返回
    app.get('/clock', function (req, res) {
      res.send(new Date().toLocaleString())
    })
    
    app.use(express.static(path.resolve(__dirname, 'public')))
    app.listen(8080)
    
    <body>
      <div id="app"></div>
      <script>
        // 每1秒向服务器请求时间
        setInterval(() => {
          let xhr = new XMLHttpRequest()
          xhr.open('GET', '/clock', true)
          xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
              app.innerHTML = xhr.responseText
            }
          }
          xhr.send(null)
        }, 1000)
      </script>
    </body>
    

    长轮询

    长轮询是对轮询的改进版,客户端发送HTTP给服务器之后,看有没有新消息,如果没有新消息,就一直等待。

    当有新消息的时候,才会返回给客户端。在某种程度上减小了网络带宽和CPU利用率等问题。

    由于 http 数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有 10 个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费

    let express = require('express')
    const app = express()
    const path = require('path')
    
    // 1秒之后更新数据才返回
    app.get('/clock', function (req, res) {
        setTimeout(() => {
          res.send(new Date().toLocaleString())
        }, 1000);
    })
    
    app.use(express.static(path.resolve(__dirname, 'public')))
    app.listen(8080)
    
    <body>
      <div id="app"></div>
      <script>
    	// 请求完成之后才发送下次请求
        (function poll () {
          let xhr = new XMLHttpRequest()
          xhr.open('GET', '/clock', true)
          xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
              app.innerHTML = xhr.responseText
              poll()
            }
          }
          xhr.send(null)
        })()
      </script>
    </body>
    
    

    iframe流

    通过在HTML页面里嵌入一个隐藏的iframe,然后将这个iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户推送数据。

    let express = require('express')
    const app = express()
    const path = require('path')
    app.get('/clock', function (req, res) {
        // 拿到父窗口,一直往里面写,没有调用end
        setInterval(() => {
          res.write(
            `
            <script>
            parent.document.getElementById('app').innerHTML="${new Date().toLocaleString()}";
            </script>
            `
          )
        }, 1000);
    })
    
    app.use(express.static(path.resolve(__dirname, 'public')))
    
    <body>
      <div id="app">
      </div>
      <iframe src="/clock" frameborder="0"></iframe>
    </body>
    

    这些通讯方式各有缺点,你都学会了吗?

    展开全文
  • 本资源是一个 CentOS 下对 Nginx + Tomcat ...详细如何配置请参考博客《图文:CentOS 下对 Nginx + Tomcat 配置 SSL 实现服务器 / 客户端双向认证》,地址是:http://blog.csdn.net/defonds/article/details/44410359。
  • 土豪公司直接买买买,iOS开发者只需要把http改成https完事。然而很不幸,我们在没钱的公司,选择了自签证书。虽然网上很多关于https的适配,然而很多都是已过时的,这里我们主要是讲一下https双向认证。 【证书选择...
  • 双向 LSTM

    千次阅读 2017-08-11 00:00:00
    本文结构:为什么用双向 LSTM什么是双向 LSTM例子为什么用双向 LSTM?单向的 RNN,是根据前面的信息推出后面的,但有时候只看前面的词是不够的,例如,我今天不舒服,我打算__一天。只根据‘不舒服‘,可能推出我...
  • 任何流(WebRTC,WebSockets,TCP等)上的双向RPC都原生支持二进制类型,而无需序列化为字符串。 [1] znode znode是Node.js和浏览器的远程方法执行库。 任何流(WebRTC,WebSockets,TCP等)上的双向RPC都原生支持二...
  • http://msdn.microsoft.com/en-us/library/95z04bas(v=VS.71).aspx 双向链表
  • 工具:keytool (Windows下路径:%JAVA_HOME%/bin/keytool.exe) 环境:Windows8.1企业版、Tomcat-7.0.27、JDK1.6、IE11、Chrome 一、为服务器生成证书 C:\Windows\system32>keytool -genkey -v -alias tomcat -...
  • Wcf利用Tcp实现双向通信,实时监控

    热门讨论 2016-10-25 20:26:13
    双向通信用我以前的HTTP协议是行不通了,问了一下别人,别人说了一个“心跳更新”这个概念,想必大家都懂这个吧,大概意思呢就是A向B定时发送一个消息来监测B是否活着,如果活着就返回一个消息,死掉当然就不需要...
  • ner-lstm, 基于多层双向LSTM的命名实体识别 这里知识库包含实现以下Arxiv预编译中所述方法的代码: https://arxiv.org/abs/1610.09756,在 ICON-16 会议( http://aclweb.org/anthology/W/W16/W16-63.pd
  • socket.io实现简单的双向通信聊天功能
  • 双向绑定原理

    千次阅读 2019-05-31 18:46:32
    希望了解双向绑定原理 从MVC、MVVM说起 参考阮一峰老师的文章:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html 流程:View根据Model展示页面,当页面发生操作时(commander),View传递指令到Controller...
  • 本文实例讲述了jQuery实现html双向绑定功能。分享给大家供大家参考,具体如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> [removed][removed] ...
  • 证书双向认证

    千次阅读 2019-06-03 07:41:25
    双向认证 在开始之前,我们先讲一下什么是证书双向认证,来看一张图: 所谓证书双向认证是指: 服务端使用ca.crt校验客户端的client.crt和client.key 客户端使用ca.crt校验服务端的server.crt和server.key 下面...
  • meta http - equiv = "X-UA-Compatible" content = "ie=edge" > < title > Document < / title > < / head > < body > < div id = "app" > < input type = "text" placeholder = "请输入文本" v - ...
  • 这是我实战的笔记,全程直播。 #### Tomcat和Openssl构建HTTPS双向认证 ###### ...二、tomcat实现双向认证 1、创建服务器信任的CA证书库 2、配置Tomcat支持HTTPS双向认证(服务器将认证客户端证书)
  •  基于ssl,一般的应用都是单向认证,如果应用场景要求对客户来源做验证也可以实现成双向认证。  为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议。SSL 协议既用到了公钥加密技术又用到了 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 175,018
精华内容 70,007
关键字:

双向http