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

    2021-04-08 12:43:12
    有关使用单个开放式连接的双向通信的文章。
  • 双向Http交互协议时,客户端接收数据乱码,使用@Headers(“Content-Type:application/json; charset=utf-8”)方式解决,在Headers中设置客户端要获取的数据类型,如下:

    双向Http交互协议时,客户端接收数据乱码,使用@Headers(“Content-Type:application/json; charset=utf-8”)方式解决,在Headers中设置客户端要获取的数据类型,如下:
    在这里插入图片描述

    @Headers("Cache-Control: max-age=640000")
    @GET("widget/list")
    Call<List<Widget>> widgetList();
    

    Headers 主要用于添加头控制,Cache-Control 控制是否保存数据,下次再规定时间内是否去服务器请求。

    展开全文
  • nginx实现http双向验证

    2018-07-07 09:44:00
     HTTP双向认证过程中,每个用户都需要有自己惟一的证书,通过CA的级联证书模式,使所有的证书都对应同一个根证书。这样需要自己生成一套CA根级证书,再借助其生成二级证书作为client证书。此时client私钥签名不仅...

    技术背景


      HTTP双向认证过程中,每个用户都需要有自己惟一的证书,通过CA的级联证书模式,使所有的证书都对应同一个根证书。这样需要自己生成一套CA根级证书,再借助其生成二级证书作为client证书。此时client私钥签名不仅可以通过对应的client公钥验证,还可通过根证书的公钥进行验证。

     

    单向验证与双向验证的区别


      单向验证: 指客户端验证服务器端证书,服务器并不需要验证客户端证书。

      双向验证:指客户端验证服务器端证书,而服务器也需要通过CA的公钥证书来验证客户端证书。

     

    详细的握手过程


     单向验证

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

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

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

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

    5、浏览器随机产生一个用于后面通讯的“通话密钥”,然后用服务器的公钥对其加密,然后将加密后的“预主密码”传给服务器。

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

    7、浏览器针对这个密码方案,接着用服务器的公钥加过密后发送给服务器。

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

    9、服务器、浏览器接下来的通讯都是用对称密码方案,使用相同的对称密钥。

     双向验证

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

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

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

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

    5、服务器要求客户的身份认证,用户可以建立一个随机数然后对其进行数字签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。

    6、服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的CA 是否可靠,发行CA 的公钥能否正确解开客户证书的发行CA的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密码”,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。

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

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

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

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

    11、服务器、浏览器接下来的通讯都是用对称密码方案,使用相同的对称密钥。

     

    安装前准备


     1、准备安装包

      获取PCRE(Perl Compatible Regular Expressions是一个Perl库,包括 perl 兼容的正则表达式库)、 OPENSSL(是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用)、 ZLIB(提供数据压缩用的函式库)的安装包。在本例中版本分别为pcre-8.36、openssl-1.0.2a、 zlib-1.2.8、 nginx-1.9.0。在安装NGINX软件之前需要依次安装以上软件,如果操作系统中包括上述软件,则不需要安装。

    2、安装PCER

    unzip "$CURRENT_PATH/$PCRE.zip" -d "$CURRENT_PATH"
    cd "$CURRENT_PATH/$PCRE"
    ./configure
    make
    make install

     3、安装OPENSSL

    tar -xvf "$CURRENT_PATH/$OPENSSL.tar.gz" -C "$CURRENT_PATH"
    cd "$CURRENT_PATH/$OPENSSL"
    ./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
    make
    make install

       注:OPENSSL的安装目录为/usr/local,OPENSSL的配制文件为/usr/local/ssl/目录下openssl.cnf。后续在CA部分需要使用到。

    4、安装ZLIB

    tar -xvf "$CURRENT_PATH/$ZLIB.tar.gz" -C "$CURRENT_PATH"
    cd "$CURRENT_PATH/$ZLIB"
    ./configure
    make
    make install

     5、安装nginx(以上软件安装成功以后)

    tar -xvf "$CURRENT_PATH/$NGINX.tar.gz" -C "$CURRENT_PATH"
    cd "$CURRENT_PATH/$NGINX"
    ./configure --prefix=$NGINX_PATH --with-http_ssl_module
    make
    make install

      注:在NGINX安装中,必须要加上--with-http_ssl_module,否则无法配制HTTPS认证。

     

    OPENSSL目录配置准备


    1、配制OPENSSL需要的目录和文件

    mkdir /etc/pki/ca_inorsight
    cd /etc/pki/ca_inorsight
    mkdir root server client newcerts
    echo 01 > serial
    echo 01 > crlnumber
    touch index.txt

     2、修改openssl配置

    vi  /usr/local/ssl/openssl.cnf

      修改里面的如下参数:

    dir = /etc/pki/ca_inorsight
    certificate = $dir/root/ca.crt
    private_key = $dir/root/ca.key

     

    创建CA根级证书


    1、生成key:

     openssl genrsa -out /etc/pki/ca_inorsight/root/ca.key

     2、生成csr:

    openssl req -new -key /etc/pki/ca_inorsight/root/ca.key -out /etc/pki/ca_inorsight/root/ca.csr

     3、生成crt:

    openssl x509 -req -days 3650 -in /etc/pki/ca_inorsight/root/ca.csr -signkey /etc/pki/ca_inorsight/root/ca.key -out /etc/pki/ca_inorsight/root/ca.crt

     4、生成crl:

    openssl ca -gencrl -out /etc/pki/ca_inorsight/root/ca.crl -crldays 7

      生成的根级证书文件都在/etc/pki/ca_inorsight/root/目录下。

      注:创建证书时,证书密码设置长度>=6位,因为java的keytool工具貌似对它有要求。

     

    创建SERVER证书


    1、生成key:

    openssl genrsa -out /etc/pki/ca_inorsight/server/server.key

     2、生成csr:

    openssl req -new -key /etc/pki/ca_inorsight/server/server.key -out /etc/pki/ca_inorsight/server/server.csr

    3、生成crt:

    openssl ca -in /etc/pki/ca_inorsight/server/server.csr -cert /etc/pki/ca_inorsight/root/ca.crt -keyfile /etc/pki/ca_inorsight/root/ca.key -out /etc/pki/ca_inorsight/server/server.crt -days 3650

     说明:  

     1、这里生成的crt是刚才ca根级证书下的级联证书,其实server证书主要用于配置正常单向的https,所以不使用级联模式也可以:

    openssl rsa -in /etc/pki/ca_inorsight/server/server.key -out /etc/pki/ca_inorsight/server/server.key
    openssl x509 -req -in /etc/pki/ca_inorsight/server/server.csr -signkey /etc/pki/ca_inorsight/server/server.key -out /etc/pki/ca_inorsight/server/server.crt -days 3650

     2、-days 参数可根据需要设置证书的有效期,例如默认365天。

     

    创建CLIENT证书


     1、生成key:

    openssl genrsa -des3 -out /etc/pki/ca_inorsight/client/client.key 1024

     2、生成csr:

    openssl req -new -key /etc/pki/ca_inorsight/client/client.key -out /etc/pki/ca_inorsight/client/client.csr

     3、生成crt:

    openssl ca -in /etc/pki/ca_inorsight/client/client.csr -cert /etc/pki/ca_inorsight/root/ca.crt -keyfile /etc/pki/ca_inorsight/root/ca.key -out /etc/pki/ca_inorsight/client/client.crt -days 3650

    说明:
    1、这里就必须使用级联证书,并且可以重复该步骤,创建多套client证书。

    2、生成crt时可能会遇到如下报错:

      openssl TXT_DB error number 2 failed to update database

      可参照这里进行操作,即将index.txt.attr中unique_subject = no,在实际应用场景中,证书subject应该有所不同。生产环境上不建议修改此值。

     

    配置NGINX


    1、在nginx.conf配置,在此指列出需要配置的server段部分代码:

    ssl_certificate  /etc/pki/ca_inorsight/server/server.crt;#server公钥
    ssl_certificate_key  /etc/pki/ca_inorsight/server/server.key;#server私钥
    ssl_client_certificate   /etc/pki/ca_inorsight/root/ca.crt;#根级证书公钥,用于验证各个二级client
    ssl_verify_client on;

     2、重启nginx生效。

     

     nginx.conf代码片段


    upstream connrub {
            sticky name=route;        
            server 172.31.122.187:8081;   #后端应用的IP,支持http和https端口,可配置多个
            server 172.31.124.142:8082;   #后端应用的IP,端口
            check interval=3000 rise=2 fall=5 timeout=1000 type=http;
            check_http_send "GET / HTTP/1.0\r\n\r\n";   #返回节点状态的API,200为OK "GET or HEAD" "/ API路径" "1.0 HTTP协议"
            check_http_expect_alive http_2xx http_3xx http_4xx;
        }
    #http配置
        server {
            listen 8080;  #http访问端口
            server_name localhost;
            
           location / {
               proxy_pass http://connrub;
           }
            
            location /nstatus {
                check_status;
                access_log off;
                allow 122.168.21.131;  #允许进行后端服务器状态检查的ip
                allow all; #允许任意ip检查后端服务器状态。不建议配置
                deny all;
            }
        }
    
    #https配置可选
    #https配置        
        server {
            listen 8081 ssl;    #8081为https端口
            server_name localhost; #localhost修改为节点IP
            ssl_certificate     ./ssl/nginx.pem; 
            ssl_certificate_key ./ssl/nginx.key; 
            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2; 
            ssl_ciphers         HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers on;         
            ssl_client_certificate ./ssl/rootca.der; #双向认证时开启      
            ssl_verify_client on;    #双向认证时开启
            ssl_verify_depth 2;      #双向认证时开启
             location / {
               proxy_pass https://connrub; #后端应用开启https,如果后端服务器没有开启https,则为http://connrub
             }
             location /nstatus {
                check_status;
                 access_log off;
                 #allow 192.168.2.11; #允许进行后端服务器状态检查的ip
                 #allow all; #允许任意ip检查后端服务器状态。不建议配置
                 deny all;
            }
        }

     

     

          完毕。

    转载于:https://www.cnblogs.com/it-way/p/9276418.html

    展开全文
  • http server双向认证

    2019-12-09 15:12:03
    4、启动http server,启动时要加载自己的证书,启动时使用tls 代码实现 package main import ( "crypto/tls" "crypto/x509" "fmt" "io/ioutil" "log" "net/http" ) func main ( )...

    1、客户端认证服务器;
    2、服务器认证客户端;
    3、服务器的证书使用openssl自签名证书(我们使用server.crt就可以当做ca证书
    4、客户端的证书使用openssl自签名证书(我们使用client.crt就可以当做ca证书

    1、服务器

    分析流程

    1、注册client ca证书
    (1)读取client的ca证书
    (2)创建ca池,把client的ca添加到ca池
    2、配置tls生成cfg
    3、创建http server,使用cfg
    4、启动http server,启动时要加载自己的证书,启动时使用tls

    代码实现

    package main
    
    import (
    	"crypto/tls"
    	"crypto/x509"
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    )
    
    func main(){
    	//1、注册client ca证书
    	//(1)读取client的ca证书,client的证书也是自签名的,自己认证自己
    	caInfo,err := ioutil.ReadFile("./client.crt")
    	if err != nil{
    		log.Fatal(err)
    	}
    	//(2)创建ca池,把client的ca添加到ca池
    	caCertPool := x509.NewCertPool()
    	caCertPool.AppendCertsFromPEM(caInfo)
    	//2、配置tls生成cfg
    	cfg := tls.Config{
    		//需要两个字段,我们认证client
    		ClientAuth:tls.RequireAndVerifyClientCert,
    		ClientCAs:caCertPool,	//客户端的ca池填充在这里
    	}
    	//3、创建http server,使用cfg
    	server := http.Server{
    		Addr:":8848",
    		Handler:myhandler{},
    		TLSConfig:&cfg,
    	}
    	//4、启动http server,启动时要加载自己的证书,启动时使用tls
    	err = server.ListenAndServeTLS("./server.crt","./server.key")
    	if err != nil{
    		log.Fatal(err)
    	}
    }
    
    type myhandler struct{
    
    }
    
    func (h myhandler)ServerHTTP(w http.ResponseWriter , r *http.Request)  {
    	fmt.Printf("ServerHttp called\n")
    	w.Write([]byte("hello world!!!!"))
    }
    
    

    2、客户端

    分析流程

    1、注册给服务器颁发证书的ca
    (1)读取ca证书
    (2)把ca的证书添加到ca池中
    (3)加载客户端的证书和密钥,得到一个clientCert(相对于单向认证,修改部分)
    2、配置tls,增加clientCert(相对于单向认证,修改部分)
    3、创建http client
    4、client发起请求
    5、打印返回值

    代码实现

    package main
    
    import (
    	"crypto/tls"
    	"crypto/x509"
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    )
    
    func main(){
    	//1、注册给服务器颁发证书的ca
    	//(1)读取ca证书
    	caCertInfo,err:= ioutil.ReadFile("./server.crt")
    	if err != nil{
    		log.Fatal(err)
    	}
    	//(2)把ca的证书添加到ca池中
    	caCertPool := x509.NewCertPool()
    	caCertPool.AppendCertsFromPEM(caCertInfo)
    	//(3)加载客户端的证书和密钥,得到一个clientCert(相对于单向认证,修改部分)
    	//func LoadX509KeyPair(certFile, keyFile string) (Certificate, error)
    	clientCert , err := tls.LoadX509KeyPair("./client.crt","./client.key")
    	if err != nil{
    		log.Fatal(err)
    	}
    	//2、配置tls,增加clientCert(相对于单向认证,修改部分)
    	cfg := tls.Config{
    		//服务器的ca池
    		RootCAs:caCertPool,
    		//客户端证书
    		Certificates:[]tls.Certificate{clientCert},
    	}
    	//3、创建http client
    	client := http.Client{
    		Transport:&http.Transport{
    			TLSClientConfig:&cfg,
    		},
    	}
    	//4、client发起请求
    	response,err := client.Get("https:localhost:8848")
    	if err != nil{
    		log.Fatal(err)
    	}
    	//5、打印返回值
    	bodyInfo,err := ioutil.ReadAll(response.Body)
    	if err != nil{
    		log.Fatal(err)
    	}
    	defer response.Body.Close()
    	fmt.Printf("body Info:%s\n",bodyInfo)
    	fmt.Printf("status code: %s\n",response.Status)
    }
    
    展开全文
  • 基于Http双向通讯V.S.基于TCP的双向通讯由于Http和TCP在各自协议上的差异,他们实现双向通信的发式是不同的。Http是一个应用层的协议,它的主要特征就是无连接和无状态(connectless & stateless)。它采用传统...

    基于Http的双向通讯V.S.基于TCP的双向通讯

    由于Http和TCP在各自协议上的差异,他们实现双向通信的发式是不同的。

    Http是一个应用层的协议,它的主要特征就是

    无连接和无状态(connectless & stateless

    )。它采用传统的Request/Reply的方式进行通信,Client发送Http

    Request请求Server的某个资源,Server端接收到该Http Request, 回发对应的Http

    Response。当Client端接收到对应的Response,该Connection会关闭。也就是说Client和Server的

    Connection仅仅维持在发送Request到接收到Response这一段时间内。同时,每次基于Http的

    connection是相互独立,互不相干的,当前connection无法获得上一次connection的状态。为了保存调用的的状态信息,

    ASP.NET通过把状态信息保存在Server端的方式实现了对Session的支持,具体的做法是:ASP.NET为每个Session创建一个

    Unique ID,与之关联一个HttpSessionState对象,并把状态信息保存在内存中或者持久的存储介质(比如SQL

    Server)中。而WCF则采用另外的方式实现对Session的支持:每个Session关联到某个Service Instance上。

    回到我们WCF双向通信的问题上,当

    Client调用Service之前,会有一个Endpoint在Client端被创建,用于监听Service端对它的Request。Client对

    Service的调用会建立一个Client到Server的Connection,当Service在执行操作过程中需要Callback对应的

    Client,实际上会建立另一个Service到Client的Http

    connection。虽然我们时候说WCF为支持双向通信提供Duplex Channel,实际上这个Duplex

    channel是由两个Request/Reply Channel组成的。

    而对于TCP/IP簇中的传输层协议TCP,它

    则是一个基于Connection的协议,在正式进行数据传输的之前,必须要在Client和Server之后建立一个Connection,

    Connection的建立通过经典的“3次握手”来实现。TCP天生就具有Duplex的特性,也就是说当Connection被创建之后,从

    Client到Sever,和从Server到Client的数据传递都可以利用同一个Connection来实现。对于WCF中的双向通信,

    Client调用Service,Service Callback

    Client使用的都是同一个Connection、同一个Channel。所以基于TCP的Duplex

    Channel才是真正意义上的Duplex Channel。

    展开全文
  • httptunnel:在HTTP请求中通过隧道传输的双向数据流
  • HTTP双向认证过程中,每个用户都需要有自己惟一的证书,通过CA的级联证书模式,使所有的证书都对应同一个根证书。这样需要自己生成一套CA根级证书,再借助其生成二级证书作为client证书。此时client私钥签名不仅可以...
  • workerman 进行tcp和http双向连接

    万次阅读 2019-12-20 15:37:17
    workerman 进行tcp和http双向连接 本来想采用GatewayWorker来完成的,最后还是想写简单一点。用workerman进行和智能设备的tcp长连接和http的短连接。 场景需求。小程序端传给服务器开启设备或调节温度等操作。服务器...
  • java http 双向认证代码

    2017-01-21 15:16:01
    java 利用原生URLConnection 双向认证get,post请求文件,down下载
  • 11.再谈WCF的双向通讯-基于Http双向通讯 V.S. 基于TCP的双向通讯
  • http 上的双向通信 最近大概看了下 rxJava 的订阅者模式,然后突发奇想有没有可能用类似的思路实现纯 http 上的双向通信 A 是传统的 http 服务器 B 是普通的客户端,假设我们能够在 B 上启动一个简易的 http ...
  • tomcat6配置双向认证1、生成服务器端证书Java代码keytool -genkey -keyalg RSA -dname "cn=localhost,ou=sango,o=none,l=china,st=beijing,c=...
  • 服务器端证书:keytool -genkey -v -alias server -keyalg RSA -keystore c:\tomcat.jks -dname "CN=server,OU=nice,O=nice,L=BJ,ST=BJ,C=CN" -storepass 12345678 -keypass 12345678 -validity 3650导出服务器端...
  • http 上的双向通信 最近大概看了下 rxJava 的订阅者模式,然后突发奇想有没有可能用类似的思路实现纯 http 上的双向通信 A 是传统的 http 服务器 B 是普通的客户端,假设我们能够在 B 上启动一个简易的 http ...
  • http://msdn.microsoft.com/en-us/library/95z04bas(v=VS.71).aspx 双向链表
  • 一、实现http双向认证①使用OpenSSL生成CA证书# cd /etc/pki/CA# openssl genrsa -out private/my-ca.key# openssl req -new -key private/my-ca.key -out private/my-ca.csr:生成证书请求文件# openssl req -new ...
  • /** * 使用 httpclient4.5 进行 https 通讯, * 采用双向认证, 连接池管理connection * * @author wangfeihu * */ public class HttpClientforSSL { public static HttpClientConnectionManager ...
  • http协议是无法实现客户端和服务器的双向通信的,因为他限制了通信请求只能是客户端发给服务器(request),服务器只能给出应答(response)。但是http协议的其中一个特性是请求都是无状态的,也就是说无时间限制。...
  • device, 红外线 WiFi HTTP双向代理设备 IRKit设备IRKit设备和 IRKit SDK 允许你从你的iOS和Android设备控制你的家用电器。 IRKit设备有红外线LED和接收器,以及内置的无线 MODULE 。 互联网连接的设备可以让IRKit...
  • 产品由client与服务端两部分组成,client与服务端须要相互通信,协议採用http,两边各开一个port,用于http请求响应.因为开发的时候都在同一个网段进行測试,所以没有发现不论什么产品上的问题.到了客户那边才发现客户...
  • 在工作中,遇到需要开放一个web接口给对方调用,所以用到了HttpInvoker ,但是又遇到了一个问题,就是采用的是双向认证,只开放443端口,也就是说配置接口必须采用https,而且调用接口时,还需要通过双向认证。...
  • 我的WCF之旅 (11): 再谈WCF的双向通讯-基于Http双向通讯 V.S. 基于TCP的双向通讯
  • http 双向通信之端口映射

    千次阅读 2014-07-19 23:57:41
    总结一下, http双向通信在同一网段内基本没有什么问题,但是在不同网段端口映射需要配置两遍比较麻烦(前提是客户介意),采用单向轮询端口映射配置会相对轻松点.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,400
精华内容 2,960
关键字:

双向http