http server单向认证

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

一、服务器端

流程分析

1、创建http server
2、启动http server,启动时要加载自己的证书,启动时使用tls

生成服务器证书

使用-subject参数,指定服务器的相关信息,与之前不同,此时不许引导输入。
server证书生成:pem格式:

openssl req -x509 -nodes -newkey rsa:2048 -keyout server.key -out server.
crt -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=Global Security/OU=IT Department/CN=*"

代码展示

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main(){
	//1、创建http server
	server := http.Server{
		//Addr    string  		 TCP address to listen on, ":http" if empty
		Addr:":8848",
		//Handler Handler		handler to invoke, http.DefaultServeMux if nil
		Handler:nil,			//填写nil时,会使用默认的处理器,还是要自己实现处理逻辑
		// TLSConfig optionally provides a TLS configuration for use
		// by ServeTLS and ListenAndServeTLS. Note that this value is
		// cloned by ServeTLS and ListenAndServeTLS, so it's not
		// possible to modify the configuration with methods like
		// tls.Config.SetSessionTicketKeys. To use
		// SetSessionTicketKeys, use Server.Serve with a TLS Listener
		// instead.
		//TLSConfig *tls.Config
		TLSConfig:nil,
	}
	//编写处理逻辑
	//func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
	http.HandleFunc("/",func(writer http.ResponseWriter,request *http.Request){
		fmt.Println("HandleFunc!")
		writer.Write([]byte("hello world!!!"))
	})
	//2、启动http server,启动时要加载自己的证书,启动时使用tls
	//func (srv *Server) ListenAndServeTLS(certFile, keyFile string) error {
	err := server.ListenAndServeTLS("server.crt","server.key")
	if err != nil{
		log.Fatal(err)
	}
}

二、客户端

分析流程

1、注册给服务器颁发证书的ca
(1)读取ca证书
(2)把ca的证书添加到ca池中
2、配置tls
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证书,我们的证书是自签名的,server.crt能够认证自己,server.crt当成CA证书
	caCerInfo , err := ioutil.ReadFile("./server.crt")
	if err != nil{
		log.Fatal(err)
	}
	//(2)把ca的证书添加到ca池中
	//创建ca池
	certPool := x509.NewCertPool()
	//添加ca到ca池中
	certPool.AppendCertsFromPEM(caCerInfo)
	//2、配置tls
	//将承认的ca池配置给tls
	cfg := tls.Config{
		RootCAs:certPool,
	}
	//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:%s\n",bodyInfo)
	fmt.Printf("status code: %s\n",response.Status)

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
https的双向认证单向认证有一些共同的原理,但也有一些不同之处。单向认证仅仅要求客户端验证服务端的身份,而双向认证则要求服务端和客户端互相验证对方的身份。 在单向认证中,建立连接后,客户端会验证服务端的身份。验证的过程包括使用服务端公钥加密得到后续通信使用的密钥,并由服务端使用私钥解密,从而确保通信的安全。但是,单向认证仅仅验证了服务端的身份,如果有人冒充了客户端,可能会造成安全问题。 而在双向认证中,除了验证服务端的身份外,还需要验证客户端的身份。在建立连接后,服务端会先验证客户端的身份,然后验证服务端的身份。验证客户端身份的过程包括客户端发送加密方案,服务端使用客户端公钥加密选择方案,然后客户端使用服务端公钥加密密文,最后双方使用密文进行通信。通过这种方式,双向认证可以确保通信双方的身份都是合法的。 总结起来,https的双向认证单向认证都是用来验证通信双方身份的。值得注意的是,在https验证身份时,通常使用非对称加密,而在后续的通信过程中,使用对称加密来确保通信的安全。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Https单向认证和双向认证](https://blog.csdn.net/duanbokan/article/details/50847612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【网络】https单向认证和双向认证](https://blog.csdn.net/text2206/article/details/128152372)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值