当前位置: 首页 > news >正文

网站设计开发深圳seo优化推广

网站设计开发,深圳seo优化推广,做网站维护的是什么人,网络营销的策略包括文章目录 前言生成证书申请免费的证书使用Go语言生成自签CA证书 https的客户端和服务端服务端代码客户端代码 tls的客户端和服务端服务端客户端 前言 在公网中,我想加密传输的数据。(1)很自然,我想到了把数据放到http的请求中,然后通过tls确…

文章目录

  • 前言
  • 生成证书
    • 申请免费的证书
    • 使用Go语言生成自签CA证书
  • https的客户端和服务端
    • 服务端代码
    • 客户端代码
  • tls的客户端和服务端
    • 服务端
    • 客户端

前言

在公网中,我想加密传输的数据。(1)很自然,我想到了把数据放到http的请求中,然后通过tls确保数据安全。(2)更进一步,只要数据可以解析,则无需http协议,直接通过tls协议加密传输即可。本文分别尝试了这两个方案。

尝试实现方案之前,我们考虑需要实现哪些内容。(1)如何获取证书。(2)golang中如何实现一个https的客户端和服务器。(3)golang中如何实现一个tls的客户端和服务器。(4)http的request和response的构建,发送和解析。(5)对于客户端, 应用层(http)是否应该复用网络层(tcp)的连接; 哪些需求下不能复用; (6)不考虑传输层的网络细节。

注:本文不涉及相关内容的背景知识介绍。本文完整代码见仓库。


生成证书

如果有已经购买的域名,可以申请一个免费的通配符证书,便于日常使用。

没有域名的话:可以通过命令行生成证书,见:windows和linux上证书的增删查。也可以通过go代码来创建证书。


申请免费的证书

首先是安装acme.sh

sudo apt-get -y install socatda1234cao@vultr:~$ curl https://get.acme.sh | sh -s email=da1234cao@163.com% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100  1032    0  1032    0     0   4384      0 --:--:-- --:--:-- --:--:--  4410% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100  216k  100  216k    0     0   715k      0 --:--:-- --:--:-- --:--:--  715k
[Fri Aug 11 06:17:18 AM UTC 2023] Installing from online archive.
[Fri Aug 11 06:17:18 AM UTC 2023] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Fri Aug 11 06:17:19 AM UTC 2023] Extracting master.tar.gz
[Fri Aug 11 06:17:19 AM UTC 2023] Installing to /home/da1234cao/.acme.sh
[Fri Aug 11 06:17:19 AM UTC 2023] Installed to /home/da1234cao/.acme.sh/acme.sh
[Fri Aug 11 06:17:19 AM UTC 2023] Installing alias to '/home/da1234cao/.bashrc'
[Fri Aug 11 06:17:19 AM UTC 2023] OK, Close and reopen your terminal to start using acme.sh
[Fri Aug 11 06:17:19 AM UTC 2023] Installing cron job
8 0 * * * "/home/da1234cao/.acme.sh"/acme.sh --cron --home "/home/da1234cao/.acme.sh" > /dev/null
[Fri Aug 11 06:17:19 AM UTC 2023] Good, bash is found, so change the shebang to use bash as preferred.
[Fri Aug 11 06:17:20 AM UTC 2023] OK
[Fri Aug 11 06:17:20 AM UTC 2023] Install success!

为了使用方便,我这里申请一个泛域名证书。我的域名是在阿里云购买的,所以本文仅尝试获取阿里云的泛域名证书。

参考:阿里云域名使用ACME自动申请免费的通配符https域名证书、acme.sh 使用泛域名|阿里云DNS |免费申请证书。

大概过程是:AccessKey管理->创建子用户->允许open API访问->添加DNS管理权限。将获取到的AccessKey 和 Secret 写到acme.sh.env配置文件里面。

export Ali_Key="*****"
export Ali_Secret="*******"

执行source ~/.bashrc

然后开始申请证书。

sudo ufw status
sudo ufw allow 80# --debug 参数查看执行过程
# 没有web服务,80端口空闲, acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证
## 如果执行报错;稍等等会再尝试;
acme.sh --issue --dns dns_ali -d *.da1234cao.top --standalone --debug[Fri Aug 11 07:07:43 AM UTC 2023] Your cert is in: /home/da1234cao/.acme.sh/*.da1234cao.top_ecc/*.da1234cao.top.cer
[Fri Aug 11 07:07:43 AM UTC 2023] Your cert key is in: /home/da1234cao/.acme.sh/*.da1234cao.top_ecc/*.da1234cao.top.key
[Fri Aug 11 07:07:43 AM UTC 2023] The intermediate CA cert is in: /home/da1234cao/.acme.sh/*.da1234cao.top_ecc/ca.cer
[Fri Aug 11 07:07:43 AM UTC 2023] And the full chain certs is there: /home/da1234cao/.acme.sh/*.da1234cao.top_ecc/fullchain.cer
[Fri Aug 11 07:07:43 AM UTC 2023] _on_issue_success
# 查看证书信息
openssl x509 -noout -text -in '*.da1234cao.top.cer'Signature Algorithm: ecdsa-with-SHA384Issuer: C = AT, O = ZeroSSL, CN = ZeroSSL ECC Domain Secure Site CAValidityNot Before: Aug 11 00:00:00 2023 GMTNot After : Nov  9 23:59:59 2023 GMTSubject: CN = *.da1234cao.top  <-----# 查看key信息
openssl ec -noout -text -in '*.da1234cao.top.key'
read EC key
Private-Key: (256 bit)

使用Go语言生成自签CA证书

这里有比较详细的介绍:使用Go语言生成自签CA证书

package certificateimport ("crypto/rand""crypto/rsa""crypto/x509""crypto/x509/pkix""encoding/pem""io/ioutil""math/big""time"
)func Gencertificate(output string) error {// ref: https://foreverz.cn/go-cert// 生成私钥priv, err := rsa.GenerateKey(rand.Reader, 2048)if err != nil {return err}// x509证书内容var csr = &x509.Certificate{Version:      3,SerialNumber: big.NewInt(time.Now().Unix()),Subject: pkix.Name{Country:            []string{"CN"},Province:           []string{"Shanghai"},Locality:           []string{"Shanghai"},Organization:       []string{"httpsDemo"},OrganizationalUnit: []string{"httpsDemo"},CommonName:         "da1234cao.top",},NotBefore:             time.Now(),NotAfter:              time.Now().AddDate(1, 0, 0),BasicConstraintsValid: true,IsCA:                  false,KeyUsage:              x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},}// 证书签名certDer, err := x509.CreateCertificate(rand.Reader, csr, csr, priv.Public(), priv)if err != nil {return err}// 二进制证书解析interCert, err := x509.ParseCertificate(certDer)if err != nil {return err}// 证书写入文件pemData := pem.EncodeToMemory(&pem.Block{Type:  "CERTIFICATE",Bytes: interCert.Raw,})if err = ioutil.WriteFile(output+"cert.pem", pemData, 0644); err != nil {panic(err)}// 私钥写入文件keyData := pem.EncodeToMemory(&pem.Block{Type:  "EC PRIVATE KEY",Bytes: x509.MarshalPKCS1PrivateKey(priv),})if err = ioutil.WriteFile(output+"key.pem", keyData, 0644); err != nil {return err}return nil
}

https的客户端和服务端

轮子已经有了,net/http。我没有看到net/http很好的入门教程。只能看下官方文档,网上翻翻一些简单的示例。

下面是一个示例。其中,必须一提的是,http请求结束后,连接可以仍然存在,放到闲置的连接池中。便于后续请求,复用之前的连接。我到源码里面去看了下,没太看懂,可见:Golang Http RoundTrip解析。


服务端代码

启动服务端后,对于/reflect路径的request,构建一个response。注意其中的header和body内容的填充。

func reflect(w http.ResponseWriter, r *http.Request) {log.Println("handle reflect")w.Header().Set("Content-Type", "text/plain; charset=utf-8")w.WriteHeader(http.StatusOK)bodyByte, _ := io.ReadAll(r.Body)log.Println("recv:", string(bodyByte))w.Write(bodyByte)
}func Start() error {listenPort := Conf.ListenPortlistenIp := Conf.ListenIpif listenPort <= 0 || listenPort > 65535 {log.Println("invalid listen port:", listenPort)return errors.New("invalid listen port")}http.HandleFunc("/reflect", reflect)err := http.ListenAndServeTLS(listenIp+":"+strconv.Itoa(listenPort), Conf.Protocol.Https.Certificate, Conf.Protocol.Https.Key, nil)return err
}

客户端代码

客户端可以选择是否验证服务端的证书。验证证书不重要,因为我信任这个域名解析过程(如果DNS没有被污染的话)。数据可以加密传输即可。代码中使用http.NewRequest构建一个请求,然后通过http.Client.Do发送请求(可能会复用之前的连接)。

func New() *http.Client {cli := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: Conf.SkipVerify},},}return cli
}func DoRequest(cli *http.Client, data []byte) (*http.Response, error) {req, err := http.NewRequest("POST", Conf.Protocol+"://"+Conf.ServerIp+":"+strconv.Itoa(Conf.ServerPort)+"/reflect", bytes.NewBuffer(data))if err != nil {log.Println("fail to consstruct request", err)}return cli.Do(req)
}func PrintResponse(resp *http.Response, err error) {if err == nil {if resp.StatusCode == http.StatusOK {body, _ := ioutil.ReadAll(resp.Body)log.Print(string(body))}log.Println("http status code:", resp.StatusCode)} else {log.Print(err)}
}

tls的客户端和服务端

当我们的应用层不需要http协议,只需要对应用层的数据进行加密传输。我们尝试下面的代码(下面代码中,我手动构建了http的request和response,是为了保证接收到完整的数据后再处理,仅此而已)。 使用的库是crypto/tls

服务端

func TLSDataHandle(conn net.Conn) {for {// 读取requestioBuf := bufio.NewReader(conn)req, err := http.ReadRequest(ioBuf)if err != nil {log.Println(err)return}defer req.Body.Close()defer conn.Close()bodyByte, _ := io.ReadAll(req.Body)log.Println("recv: ", string(bodyByte))// 构建一个responsebuf := bytes.NewBuffer(nil)buf.WriteString("HTTP/1.1 200 OK\r\n")buf.WriteString("Content-Length: " + strconv.Itoa(len(bodyByte)) + "\r\n")buf.WriteString("\r\n")buf.Write(bodyByte)// 发送responsebuf.WriteTo(conn)}
}func TLSStart() error {listenPort := Conf.ListenPortlistenIp := Conf.ListenIpif listenPort <= 0 || listenPort > 65535 {log.Println("invalid listen port:", listenPort)return errors.New("invalid listen port")}cert, err := tls.LoadX509KeyPair(Conf.Protocol.Https.Certificate, Conf.Protocol.Https.Key)if err != nil {log.Println("fail to laod x509 key pair", err)}config := &tls.Config{Certificates: []tls.Certificate{cert}}listener, _ := tls.Listen("tcp", listenIp+":"+strconv.Itoa(listenPort), config)for {conn, _ := listener.Accept()go TLSDataHandle(conn)}
}

客户端

func NewTlsConn() (net.Conn, error) {config := &tls.Config{InsecureSkipVerify: Conf.SkipVerify}return tls.Dial("tcp", Conf.ServerIp+":"+strconv.Itoa(Conf.ServerPort), config)
}func SendRequest(conn net.Conn, data []byte) {// 构造一个请求buf := bytes.NewBuffer(nil)buf.WriteString("POST /no_thing")buf.WriteString(" HTTP/1.1\r\n")buf.WriteString("Content-Length: " + strconv.Itoa(len(data)) + "\r\n")buf.WriteString("\r\n")buf.Write(data)// 发送请求buf.WriteTo(conn)// 读取回复ioBuf := bufio.NewReader(conn)res, err := http.ReadResponse(ioBuf, nil)if err != nil {log.Println(err)return}defer res.Body.Close()bodyByte, _ := io.ReadAll(res.Body)log.Println(string(bodyByte))
}
http://www.mmbaike.com/news/50905.html

相关文章:

  • 荆门城乡建设局网站百度网盘手机app下载安装
  • 义乌公司网站制作百度广告一天多少钱
  • 中国建设银行网站首百度seo分析工具
  • 国家对地理信息网站建设的重视排名优化seo公司
  • 买网站注册人数百度下载安装到桌面
  • 网站策划师有前途吗免费ip地址代理
  • wordpress中文网站北京谷歌seo公司
  • 四川建设网官网登录汕头seo排名收费
  • 远程桌面做网站房地产销售怎么找客户
  • 世代网络网站建设设计网址注册
  • 商城网站平台怎么做的登封网站设计
  • wordpress建站注册新用户广告软文
  • 微网站的优势百度信息流推广和搜索推广
  • 公司网站建设有哪些公司可以做免费自己建网页
  • 公司平台网站建设百度爱采购怎样入驻
  • wordpress全站加速关键词可以分为哪三类
  • 深圳做公司英文网站多少钱培训课程表
  • 做网站推广业务怎么样今日头条最新消息
  • 南通网络推广公司南昌seo排名外包
  • 网站能不能自己做怎么找一手app推广代理
  • 平台网站建设收费网站seo报价
  • 小程序开发 网站建设怎么查找关键词排名
  • php开发网站建设线上广告推广平台
  • 用DW做的网站怎么弄成链接惠州百度seo在哪
  • wordpress 站点地址无锡百度快照优化排名
  • 用jquery做网站搭建网站多少钱
  • 石化建设分会网站怎么给公司做网站
  • 网站建设管理分工的说明网站seo 优化
  • 郑州最好的男科医院是什么医院宁波专业seo服务
  • 嘉兴做网站seo的正规排名网站推广公司