I+eMqyMgCg==

5q+b6Iy46Iy455qE5aSn6LGh5Zyo562J5YWs5LqkL+i2tOWcqOa1hem7hOiJsueahOWHieajmuS4i+mdoiAK4oCc5L2g6KaB5Y675ZOq6YeM5ZGA77yf4oCd5oiR5q2j5aW96Lev6L+H56uZ5Y+wIArlsLHlg4/op4HliLDkuobnhp/kurrkuIDmoLcgCuavm+iMuOiMuOeahOWkp+ixoeS4jeivtOivne+8jOmVv+mVv+eahOm8u+WtkOWQueaVo+S4gOWciOWwmOWcnwog5YWs5Lqk6L2m5byA6L+H5p2l77yM5q+b6Iy46Iy455qE5aSn6LGh5LiK5LqG6L2mIOaIkeWGs+Wumui3n+Wug+eci+eci+imgeWOu+WTquWEvyAK4oCc5ZOO77yM5ZOO4oCU6YKj6LCB77yM5Y+v5b6X5oqV5biB5ZWK5L2g77yB4oCd5piv5Y+45py65biI5YKF5Zyo5Y+rIArigJzllYrvvIzmiJHku6zmmK/kuIDotbfnmoTjgILigJ0K5oiR6LW25b+Z5Yi35LqG5Y2hIOKAnOWYgOKAlOWYgOKAlOKAnQrmiJHlnZDliLDmr5vojLjojLjnmoTlpKfosaHlkI7ovrnvvIzlj5HnjrDlhbblrp7lroPkuZ/msqHmnInlpJrlpKcgCuKAnOS9oOS4uuS7gOS5iOayoeacieWwvuW3tO+8n+KAneavm+iMuOiMuOeahOWwj+ixoeW8gOS6huWPoyAK4oCc6K+24oCm5bC+5be077yf4oCd5oiR5LiN55+l6YGT6K+l5oCO5LmI5a+55LiA5Y+q6LGh6Kej6YeKIArigJzkurrkurrpg73mnInlsL7lt7TjgILigJ0K5q+b6Iy46Iy455qE5bCP6LGh6IiU5LqG6IiU54iq5a2Q77yM5YGP552A5aS0IArigJzmmK/llYrvvIzkurrkurrpg73mnInlsL7lt7TnmoTlkYDvvIHigJ0K5LiA5peB55qE5aWz5a2p5a2Q5Lmf6L+Z5LmI6K+0IArmiJHlnKjkuIDnj63kuI3nn6XlvIDlvoDlk6rph4znmoTlhazkuqTovabkuIrvvIzmraPot5/kuIDlj6rmr5vojLjojLjnmoTosaHor7TnnYDor53vvIwK5bm25LiU5Yia5Yia55+l6YGT6Zmk5oiR5LmL5aSW55qE5Lq657G76YO95piv5pyJ5bC+5be055qEIArov5nmmK/lha3mnIjnmoTlpI/lpKk=

link

给网站添加HSTS

## HSTS是一段时间内强制客户端使用https链接的协议,只要在服务器返回给浏览器的响应头中,增加Strict-Transport-Security这个HTTP Header,如: Strict-Transport-Security: max-age=31536000; 当然,要求安全hsts还不够,第一次握手还是http,所以有了hstsproload [https://hstspreload.org/?domain=fullstack.love](https://hstspreload.org/?domain=fullstack.love) 在这里申请,审核之后,如果设置了hstshead,浏览器就会知道该域名第一次使用https连接,当出现证书错误时也不会有安全提示,而是直接禁止访问。 不过为什么要用hsts,如果是为了安全了话,网站可以只开启443端口,但是很多用户首先尝试的是http访问,为了这一部分流量…我倒觉得与其维护一份日益正想的预载列表,为什么不把https作为默认访问方式,然后需要80访问的网站申请呢…

link

Golang使用HTTPS反向代理(SNI)

SNI(Server Name Indication)<br> SNI用来解决一个服务器拥有多个域名的情况。 <br> 比如在同一台主机上配置多个域名,若都要启用https,除了设置不同端口外,还可以使用https反向代理。由于https在发送header前已经建立了加密连接,无法根据其中的header设置代理,因此思路是回到上一层,在建立TCP连接时进行判断。 <br> TLS1.3的握手时由客户端发送ClientHello信息,其中包含了ServerName信息,用于此项多域名服务。<br> 先尝试使用net包监听一下数据<br> ``` l, err := net.Listen("tcp", ":443") if err != nil { log.Panic(err) } go func() { for { // br := bufio.NewReader(l) 这样读写也可以 // h, err := br.Peek(5) client, err := l.Accept() if err != nil { log.Panic(err) } defer client.Close() var b [1024]byte n, err := client.Read(b[:]) log.Println(b) } }() ``` 然后得到了下面的[]byte,<br> [22 3 1 2 0 1 0 1 252 3 3 73 46 225 244 177 196 210 214 58 168 20 138 177 245 93 166 157 53 142 1 152 78 10 28 243 107 218 1 36 241 226 238 32 163 209 178 166 87 27 237 195 253 165 185 67 244 233 70 236 137 190 76 77 229 51 61 89 76 183 145 146 182 167 137 119 0 36 19 1 19 3 19 2 192 43 192 47 204 169 204 168 192 44 192 48 192 10 192 9 192 19 192 20 0 51 0 57 0 47 0 53 0 10 1 0 1 143 0 23 0 0 255 1 0 1 0 0 10 0 14 0 12 0 29 0 23 0 24 0 25 1 0 1 1 0 11 0 2 1 0 0 35 0 0 0 16 0 14 0 12 2 104 50 8 104 116 116 112 47 49 46 49 0 5 0 5 1 0 0 0 0 0 51 0 107 0 105 0 29 0 32 56 174 4 224 82 102 50 38 204 207 81 53 206 16 82 122 162 208 118 78 72 12 35 184 122 185 221 22 122 49 159 2 0 23 0 65 4 111 212 51 98 89 141 65 159 120 101 14 115 237 210 76 147 47 73 154 119 223 212 249 212 187 51 141 21 11 126 183 12 112 107 79 10 104 211 255 197 167 25 178 198 57 34 163 50 76 145 136 161 172 97 73 202 171 112 118 43 166 9 185 57 0 43 0 9 8 3 4 3 3 3 2 3 1 0 13 0 24 0 22 4 3 5 3 6 3 8 4 8 5 8 6 4 1 5 1 6 1 2 3 2 1 0 45 0 2 1 1 0 28 0 2 64 1 0 21 0 167 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] <br> 22(0x16)表示tls,3 1是tls1.0,2 0是长度(2x256),1是下一字段,1 252为字段长,3 3为tls1.2,按照字段+长度+值方法表示,解析就是了。。。<br> 然后发现golang官方包tls是支持SNI的,这就简单了,直接配置 <br> ``` config := new(tls.Config) testmap := make(map[string]*tls.Certificate) config.Certificates = make([]tls.Certificate, 0) c1, _ := tls.LoadX509KeyPair(certFile, keyFile) c2, _ := tls.LoadX509KeyPair(certFile2, keyFile2) config.Certificates = append(config.Certificates, c1, c2) testmap["impuss.com"] = &c1 testmap["*.impuss.com"] = &c1 testmap["fullstack.love"] = &c2 testmap["*.fullstack.love"] = &c2 config.NameToCertificate = testmap ``` 然后443端口listenAndServeTLS是把config指定就可以得到不带端口号的双域名https访问了,GO:"官方包什么都有。。。" <br> 测试如下: [impuss.com](https://impuss.com/achieve/4) [fullstack.love](https://fullstack.love/achieve/4)

link

Hello World!

这里是小桐桐的第一篇博客,感谢来访! #1 标题用 #+数字+空格+题目,如#1 标题 分割线 --- **加粗** //倾斜// ~~删除线~~ > 引用 > > > 引用 > > > 引用 ![头像](http://www.fullstack.love/static/favicon.png)

link