halo 的网络模式是桥接模式,通过 openresty 反向代理到外网,然后有 openresty 提供 ssl 服务。
之后就遇到一个特别诡异的问题 mac 、pc 的 chrome 系、firefox 浏览器访问网站都没问题
但是 ios 和 mac 平台的 safari 浏览器打开网站,基本第一次都是提示 connection was lost,必须刷新个几次才能打开网站,之后只要不关掉标签页也能正常访问。 有没有朋友遇到过此类的问题?
网站网址:www.bangzonghao.top
]]>如果多个请求,服务器(内部会串行化),所以设置的 Cookie 有新旧之分。新 Set 的 Cookie 可以覆盖旧 Cookie ,但绝对不允许旧 Cookie 覆盖新 Cookie 。
但是如果不是串行化发出请求,那么即使先发出 A ,也无法保证 A 的响应(更新 cookie )发生在 B 响应之前。就是说服务器设置的新 Cookie 可能被旧的响应覆盖。
一般怎么解决这个问题呢?
不知道有没有比较 Best Practice 的做法。如果 HttpOnly ,那么 web 端似乎手段更加有限?
]]>另外,有人知道这 waf 的授权绑定硬件吗?现在需要迁移虚拟机,迁移后需要重新授权吗?
]]>手动更新证书后问题依然存在
昨晚凌晨正常使用,今早起来突然出现这个问题了
请问会是什么原因造成的?
]]>url='xxxxxxxxxxxxxxx' yield scrapy.Request( url=url, cookies=self.cookies, headers=self.headers, meta={ 'download_timeout': 60 }, callback=self.save, ) rs = requests.get(url, headers=self.headers, cookies=self.cookies, timeout=60)
这可能是什么原因造成的呢?找了一圈也没发现原因。COOKIES_ENABLED 设置成 True 的
]]>POST /jars/upload HTTP/1.1 Host: localhost:8081 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Connection: close Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryoZ8meKnrrso89R6Y Content-Length: 187 ------WebKitFormBoundaryoZ8meKnrrso89R6Y Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/success" success ------WebKitFormBoundaryoZ8meKnrrso89R6Y--
这样一段 HTTP 包,无论用 postman ,postwoman, curl 之类的工具都需要自行修改这个字符串以符合他们的使用格式, 有些不方便。
]]>很多四个字母的域名没有注册
现在可以找回之前 .ml 的免费域名了。
]]>Transport Layer Security(TLS) 是由 IETF 主导的, 对 SSL 的更新. TLS 的初始版本和 SSL 3.0 基本相同. TLS 1.2/1.3 是当前的主流版本, 1.3 相对 1.2 在安全和性能上都有明显的提高.
数据经过加密后(Encrypt), 仅拥有对应密钥的人, 经过解密后可以看到数据的内容. 密钥的形式分为对称密钥和非对称密钥, 非对称密钥下, 常由第三方用公钥对数据进行加密, 随后仅私钥的持有者可以解密对应数据.
摘要(Digest)是指将不定长的数据映射到固定长度, 如 MD5 就会产生 128 比特的字符串. 数据发布者主动公布摘要后, 数据使用者可以按相同规则计算数据的摘要, 通过比对, 校验数据的完整性, 避免使用的数据被篡改.
签名(Sign)是指使用非对称密钥中的私钥计算数据对应签名, 使用者可以使用对应公钥验证数据和签名的关联性, 进而确保数据是由公钥对应方发布或认证的.
基于 RSA 交换密钥的 TLS 握手流程如下, 常见于 TLS 1.2:
客户端确认服务端身份依赖于 Certificate Authority (CA), 即证书颁发机构. 其工作机制可以简单的理解为:
基于 RSA 的密钥交换中, 由客户端生成 pre-master secret 后, 使用服务端的公钥加密后传输给服务端. 理论上, 仅服务端使用严密保护的私钥可以解密这部分数据获取到 pre-master secret. 随后, 客户端和服务端用 pre-master secret, 客户端随机数和服务端随机数生成相同的密钥, 用于后续数据的对称加解密.
TLS 1.3 相较于 TLS 1.2 在安全性和握手效率上都要较大的提高, 具体可以参考 为什么要使用 TLS 1.3 ?.
Server Name Indication (SNI) 是 TLS 的一个扩展, 允许客户端在 ClientHello 中指定想要连接的主机名. SNI 主要用于同一 IP 的服务器承载多个主机名的场景.
诸如 Istio 这样的 Mesh 方案, 会大量使用 SNI 来做路由.
Source: https://github.com/j2gg0s/j2gg0s/blob/main/_posts/2023-11-27-TLS%20%E5%9B%9E%E9%A1%BE.md
]]>所以,想请问下在座的巨佬,目前的半小时是 Cookie 引起的吗? 我不太懂 Cookie 的规则,有没有方法可以延时该请求? 能超越半小时的限制?
]]>项目运行环境
今天采用 gmssl 签发了一个测试证书 sm2/rsa 双 https 证书。 然后为 tomcat8 与 jdk1.8 分别增加了国密解析的 jar 包。
项目在 http 下正常运行,但是 https 时出现访问静态文件时却出现了 500 错误,tomcat 报错 SSLPeerUnverifiedException: peer not authenticated
。
诡异的是却有一小部分静态文件访问正常(已关闭浏览器缓存)
有哪位大兄弟有做过这方面的工作吗,求助!
]]>curl https://example.com
它可以输出请求到响应各阶段的耗时,包括 DNS 解析、TLS 握手、等信息
]]>因为做企业开发,不知道有没有用原生写的。。。要求:
1 ,最好是开源的。 2 ,不要国人开发的。。。(公司规定)
不知道各位小伙伴都在用啥。。。
]]>想找一个开源的工具来实现这样的管理,可以添加机器的 IP ,可以编辑 http 请求组,然后发起任务批量往这些 IP 上发送 http 请求,并记录结果或者重试。
总感觉应该有现成的轮子能实现。
]]>专用代理服务器提供的专用 SOCKS5 代理,快速稳定,定期更新。 大多数代理的延迟约为 10 毫秒,匹配专用住宅 IP ,这点我在使用过程中确实感觉到很好用
结合 SOCKS5 代理的高匿名性,保护用户隐私和安全,轻松实现国际网速加速。
客服方面,支持日付、月付,MaxProxy 的专业团队提供及时的技术支持,联系很方便 支持多种联系方式。
MaxProxy 的优点: IP 地址的大量分配 良好的常见问题解答支持页面 安全可靠 廉价代理 易于设置 MaxProxy 的缺点: 暂时没有免费试用
Ⅱ YourPrivateProxy 住宅 IP 工作作为专用代理 代理产品类型:静态住宅 IP 验证方式:用户密码+ IP 验证 地理位置定位:引用 代理协议:HTTP ( S ) YourPrivateProxy 是市场上顶级的住宅代理提供商之一。使用 YourPrivateProxy ,您可以匿名浏览 Internet 并执行诸如社交帐户管理和运动鞋站点之类的任务。
它们只有 2 个用于静态住宅 IP 代理的服务器位置,您可以选择要使用的一个。他们的静态住宅 IP 代理来自美国 2 个城市,弗吉尼亚州阿什本和伊利诺伊州芝加哥。
在速度方面,它们也非常快速。关于安全性,请放心,YourPrivateProxy 很可靠。
它们的价格相当便宜,您可以选择免费试用。但是,他们的退款政策仅允许基于技术而非兼容性的退款。延迟也是 YourPrivateProxy 的最受批评的特性之一。
YourPrivateProxy 的优点: 优惠的价格 选择地点的能力 高速上网 免费试用 YourPrivateProxy 的缺点: 延迟不够好 退款政策仅基于技术性
Ⅲ Proxyrack 适用 于网络抓取的小型项目 代理要约类型:旋转住宅 IP 代理网络池:池中有 480 万个 IP 认证方式:用户+通行证 地理位置定位:不支持(美国或全球混合) 代理协议:HTTP ( S )+ Socks5 Proxyrack 是顶级的住宅代理提供商之一。他们在社交媒体代理提供方面为自己创造了一个利基市场。他们有 Skype ,Whatsapp ,Facebook ,Instagram ,Gmail ,PokémonGo ,Telegram 和 Viper 的代理。
除了提供住宅代理服务外,它们还提供数据中心代理服务,可以说是市场上最便宜的服务之一。即使他们不提供免费试用,也有高达 14 天的退款政策,这是他们信任所提供服务的标志。除代理服务器外,Proxyrack 还进入 VPN 市场,他们拥有自己的市场份额。
在美国和加拿大,亚洲和大洋洲以及欧洲,他们的代理人超过 1,250,000 。他们获得了良好的客户支持服务,并且带宽数量没有限制。
Proxyrack 的优点: 社交媒体自动化的完美选择 良好的客户服务 14 天退款政策 无限带宽 Proxyrack 的缺点: 没有免费试用 地理位置定位功能差
Ⅳ Proxy-cheap 没有每月的货币承诺
代理要约类型:旋转住宅 IP 代理网络池:池中有 6+百万个 IP 认证方式:用户+通行证 地理位置定位:国家(支持 127 个) 代理协议:HTTP ( S )+ Socks5 Proxy-cheap 提供了一些市场上最便宜的住宅代理,且在全球拥有超过 600 万个住宅 IP ,支持约 127 个国家。Proxy-cheap 具有会话代理,这些代理将在更改之前的一段时间内保持相同的 IP (和会话)。如果您正在寻找可以在每次请求后更改 IP 的高旋转代理,也可以从 Proxy-cheap 中获取它们。
Proxy-cheap 声称提供了最佳的性价比。而且,如果您查看它的价格,您会在某种程度上同意这一点,因为它的代理很便宜,且没有每月最低消费承诺。您可以购买低至 1 GB 的带宽,且当您购买更多带宽时,每 GB 的价格可以降至 3 美元。
Proxy-cheap 的优点: 非常便宜 良好的地理位置覆盖 没有最低每月承诺 相当大的游泳池 Proxy-cheap 的缺点: 不提供退款 不太好的客户支持 仅支持国家 /地区级地理位置定位
]]>https 的双向认证应该是打开所有页面才需要,这种情况下,是不是标准的 https 双向认证。
]]>What needs to be done to make the REST architectural style clear on the notion that hypertext is a constraint? In other words, if the engine of application state (and hence the API) is not being driven by hypertext, then it cannot be RESTful and cannot be a REST API. Period. Is there some broken manual somewhere that needs to be fixed?
--Roy Fielding, Creator of the term REST
REST APIs must be hypertext-driven
https://htmx.org/essays/how-did-rest-come-to-mean-the-opposite-of-rest/
]]>最近看 NextCloud 这个自建网盘的服务,里面的 js 文件体积巨大,如果不启用压缩,进个页面加载都要转半天。 看了一下安装配置的文档,在 Nginx 里它是针对部分类型启用了 Gzip 压缩的。
此外,Google 也搞出了 ngx_brotli 这么个插件,专门来压缩 HTTP 内容。
此时,我想问问各位,大家认为是否应该 /是否需要开启压缩呢?大家的服务器里开启了压缩吗?
]]>还有其他 go 语言的框架比如 echo,gin 这种框架,能不能不关闭服务也能更新证书吗?谢谢啦。
]]>对于这个二进制传输,我不太理解。
假设我给服务器发送的是文本消息:你好
在 HTTP1.1 中会在 head 中标注上:content-type: text/html; charset=UTF-8
然后 body 中把 "你好" 按 utf-8 编码表转成0x4F60(你) 0x597D(好)
对应的一长串的二进制形式传输
"你好" 在网络上传输就是二进制传输,为啥不算二进制流?
是因为使用的是文本编码格式吗?
那在 HTTP2 中不使用文本格式编码,怎么处理 "你好" 呢?
是新制定一种编码格式吗?
比如我自定义一种 newCoding 编码:
你 ---> 01
好 ---> 10
在 head 中声明content-type: application/binary; newCoding
然后 body 中就直接发送01 10
我可以这样理解吗?
]]>小白今天在写 python requests proxies 的时候发现,请求 https 网站一直提示握手失败,部分代码如下
requests_proxies = { 'http': f"http://{first_proxy}", 'https': f"https://{first_proxy}", } last_proxy = s.get('https://ifconfig.me', proxies=requests_proxies, timeout=10).text
,后面才发现本地 clash 开的是 socks5 和 http 代理,没有 https 代理,搜索发现网上有人把 https://改成了 http://,使用 http 代理协议来访问 https 网站可以成功。
于是上网学习一番,发现了下面这两篇文章:(其中第 1 篇文章最主要的是评论部分)
其中第 1 篇文章评论中有一段
techon 2017-02-16 11:04:51 现在来说 HTTP 代理可以支持 SSL ,能够代理 https 网站 HTTPS 代理一般也支持 http 前者为代理协议,后者是应用协议,不可混同一谈
好像解释了 http 代理协议可以用来访问 https 站点,那么对应第 2 篇文章中的应该就是最后面的图
物理机 Windows 10
C:\Windows\system32>curl -V curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL Release-Date: [unreleased] Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL
虚拟机 Linux Mint 19.3 ,等价 Ubuntu 18.04 LTS
# mint @ mint-virtual-machine in ~ [11:38:30] $ curl -V curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.1 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3 Release-Date: 2018-01-24 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
在虚拟机中,前几天下午用 pycharm 的时候突然弹出个公司的证书,不知道为啥,就正常写代码中。
后面尝试发现所有 https 站点连接都有问题,比如下图中的某度,
按照 curl 问题指引 https://curl.se/docs/sslcerts.html ,下载 cacert.pem ,运行依然没有效果
同时物理机上面的 windows curl 也不好使了
忽略掉证书是可以的,比如curl -v https://www.baidu.com --insecure
但是这并不是解决方案啊,另外其他使用 HTTPS 的工具好像也连不上 HTTPS 站点了,像是系统问题?但是实在想不明白物理机和虚拟机同时不能请求 HTTPS 的原因是啥。
/?key=value
我想问的是规范中有没有对这种格式做出解释?
/?xxx
这个xxx
是当作 key 处理了还是当作 value 处理?还是由服务器实现决定?
问题:客户端从外部发来一次 http post 请求。如果客户端的 socketTimeout 时间(比如 10s )小于服务器处理这次请求业务数据的时间(比如从收到请求建立连接要 30s 才能返回结果给客户端),那这时候客户端已经 timeout 关闭了此次连接了,服务端能否感知到或者说检测到返回数据时客户端已经关闭的状态?
菜鸟提问,各位大佬多多包涵哈哈。
]]>418 I'm a teapot 服务器拒绝尝试用 “茶壶冲泡咖啡”。
wtf?这玩意在 developer.mozilla.org 这个网站上显示是所有浏览器兼容,实际上测了一下,就没有哪个浏览器兼容的。 这玩意真震撼我一年, 查了一查,居然还有个 [save418]https://save418.com 这么个网站。 一时不知道说什么好。 话说各位有没有谁知道哪个浏览器现在支持这个状态码的?我想打开看看。
]]>不太清楚这里面有多少是由于 http2 的特性保证的,但有点动心想把服务迁移到 http2 。想问一下如果想使用 http2 这些比如连接复用之类的特性,在服务端开发过程中是有感知的吗?还是说把挂载服务的 nginx 调到支持 http2 就 ok 了,剩下的浏览器会自动完成?
]]>https://www.uukanshu.com/b/151226/
postman
访问没问题,200 postman
的 header
使用 curl
加上 postman
的 header
执行一下
curl -H "User-Agent:PostmanRuntime/7.28.2;Accept:*/*;Host:www.uukanshu.com;Accept-Encoding:gzip, deflate, br;Connection:keep-alive;Cookie:ASP.NET_SessiOnId=tbugww5w3cqigikqsg2ezvm5; fcip=111" https://www.uukanshu.com/b/151226/
得到如下的返回
<html><head><title>Object moved</title></head><body> <h2>Object moved to <a href="/404.htm">here</a>.</h2> </body></html>
想请教一下如何解决这个问题呢,目标网站没看懂是如何做的校验,谢谢
]]>我可以另外搭建一个 nginx 作为 https 反向代理,但是鉴权的话现在只能想到 https basic authenticate 。请问有没有更安全、简单的做法呢?
]]>代理服务器版本 squid/3.5.19
]]> {"result":{"code":1,"msg":"1111"}} {"result":{"code":2,"msg":"2222"}} {"result":{"code":3,"msg":"3333"}} {"result":{"code":4,"msg":"4444"}} {"result":{"code":5,"msg":"5555"}} {"result":{"code":6,"msg":"6666"}}
但是使用runtime.JSONPb.Decode
时,也会得到五个结果,但每个 decode 出来是个 nil... :
=== RUN TestHttpRespStream service_test.go:147: resp: <nil> service_test.go:147: resp: <nil> service_test.go:147: resp: <nil> service_test.go:147: resp: <nil> service_test.go:147: resp: <nil> service_test.go:147: resp: <nil> service_test.go:149: EOF --- PASS: TestHttpRespStream (0.62s)
这是 proto 文件:
// ./pb/test.proto syntax = "proto3"; package pb; option go_package = "/pb;pb"; import "google/api/annotations.proto"; message Req { int32 id = 1; string name = 2; } message Resp { int32 code = 1; string msg = 2; } service TestService { rpc QueryStreamResp(Req) returns (stream Resp){ option (google.api.http) = { post: "/query-stream-resp" body: "*" }; }; rpc QueryStreamReq(stream Req) returns (Resp){ option (google.api.http) = { post: "/query-stream-req" body: "*" }; }; rpc Query(stream Req) returns (stream Resp){ option (google.api.http) = { post: "/query" body: "*" }; }; }
grpc 服务端:
func (ts *TestService) QueryStreamResp(req *pb.Req, stream pb.TestService_QueryStreamRespServer) error { log.Printf("QueryStreamResp|start...|req: %+v\n", req) result := []*pb.Resp{ {Code: 1, Msg: "1111"}, {Code: 2, Msg: "2222"}, {Code: 3, Msg: "3333"}, {Code: 4, Msg: "4444"}, {Code: 5, Msg: "5555"}, {Code: 6, Msg: "6666"}, } // header := make(metadata.MD) // header.Append("content-type", "application/json") // stream.SendHeader(header) for i := range result { log.Printf("resp: %+v", result[i]) if err := stream.Send(result[i]); err != nil { log.Fatal(err) } time.Sleep(100 * time.Millisecond) } log.Println("QueryStreamResp|stop...") return nil }
单元测试:
func TestHttpRespStream(t *testing.T) { url := "http://127.0.0.1:8080/query-stream-resp" reqData := &pb.Req{Id: 1, Name: "111"} var buffer bytes.Buffer encoder := (&runtime.JSONPb{}).NewEncoder(&buffer) if err := encoder.Encode(reqData); err != nil { t.Fatal(err) } ctx, cancel := context.WithCancel(context.Background()) defer cancel() req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, &buffer) if err != nil { t.Fatal(err) } resp, err := http.DefaultClient.Do(req) if err != nil { t.Fatal(err) } defer resp.Body.Close() // body, err := ioutil.ReadAll(resp.Body) // if err != nil { // t.Fatal(err) // } // t.Logf("body: %s", string(body)) jsonb := new(runtime.JSONPb) dencoder := jsonb.NewDecoder(resp.Body) for { var result *pb.Resp err := dencoder.Decode(result) if err == nil { t.Logf("resp: %+v", result) } else { t.Logf("%+v", err) break } } }
]]>