最近遇到了一件事, 让我又多熟悉了下HTTPS的相关内容, 先看看HTTPS的结构
通常的HTTP网络结构如下
+------+
| HTTP |
+------+
| TCP |
+------+
| IP |
+------+
...
HTTP的的相关内容是通过TCP明文传输的, 如果有中间监听者, 可以直接看结相关内容.
HTTPS的结构
2021-03-20 01:25AM
最近一直在研究关于如何给一个fabric的组织更换一个新的证书, 包括所有加入的通道, 所有peer和orderer.
用了很多看似完美的方法却多次测试失败, 最后总算找到一种方法.
{
"channel_group": {
"groups": {
"Application": {
"groups": {
"Org1MSP": {
"groups": { },
"mod_policy": "Admins",
"values": {
"MSP": {
}
},
"version": "0"
},
"Org2MSP": {
"groups": { },
"mod_policy": "Admins",
"values": {
"MSP": {
}
},
"version": "0"
}
},
"version": "1"
},
"Orderer": {
"groups": {
"OrdererOrg": {
"groups": { },
"values": {
"MSP": {
}
},
"version": "0"
}
},
"values": {
"ConsensusType": {
"mod_policy": "Admins",
"value": {
"metadata": {
"consenters": [
{
"client_tls_cert": "==",
"host": "orderer.example.com",
"port": 7050,
"server_tls_cert": "=="
}
],
"options": {
"election_tick": 10,
"heartbeat_tick": 1,
"max_inflight_blocks": 5,
"snapshot_interval_size": 16777216,
"tick_interval": "500ms"
}
},
"state": "STATE_NORMAL",
"type": "etcdraft"
},
"version": "0"
}
},
"version": "0"
}
},
"sequence": "2"
}
}
一个通道配置块类似上面这种,为了看的清楚有些内容我删了, 更换证书我们需要保证application及orderer的MSP是相同的, 否则更新配置块是不会成功的, 且我们得保证当前组织的raft节点的证书也要全部更换掉.
比如grub
在/etc/default/grub
的GRUB_CMDLINE_LINUX_DEFAULT=
中添加
intel_iommu=on i915.enable_gvt=1 i915.enable_guc=0
在/etc/mkinitcpio.conf
的MODULES=()`中添加:
# linux 5.14后,arch的linux内核模块已经不会勾选vfio-mdev,自测不影响gvt-g
kvmgt vfio vfio-iommu-type1s
然后运行,我用的zen内核所以是linux-zen,默认内核是linux
sudo mkinitcpio -p linux-zen
重启计算机
查看/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types
可以看见类似如下的目录
生成一个密钥
gpg --full-gen-key
之后会选择加密方式, 有效期, 用户名及邮箱, 密码, 按自己需求填就行了.
创建一个子密钥
gpg --edit-key [key hash]
gpg> addkey
#只有与前面是相同的, 按需求选择.
gpg> save
# 保存
导出密钥
gpg -o /path/gpg_key --export-secret-keys [key hash]
导出子密钥
gpg -o /path/gpg_key.sub --export-secret-subkeys [key hash]
导出吊销证书
gpg --generate-revocation [key hash]
# 输出是文本内容, 复制保存下来就行了
complete document MaxMind DB File Format SpecificationDescription
here is only how convert trie tree to array
0100, 1011 -> trie
root
|
+-----+------+
/ \
0 1
/ \ / \
null 1 0 null
/ \ / \
0 null null 1
/ \ / \
0 null null 1
trie -> array
left is 0, right is 1
value is index of array
这个DNS系列现在有以下几篇文章
DNS EDNS DNSSEC DNS over HTTPS 完整代码请看DNS
DOH就比较简单了,因为DOH使用的请求数据和应答数据均为之前的DNS协议格式,包括DNS,EDNS,DNSSEC…当然是否支持EDNS,DNSSEC需要看DNS服务器的支持情况
DOH的最主要的区别是把DNS使用的UDP,换成了HTTPS,这样就能防止DNS污染了,而且可以使用DNSSEC加上ESNI来防止证书劫持,DOH的协议在rfc8484中有定义
DOH主要有两种方式HTTP的GET请求和POST的请求
GET请求需要使用BASE64对请求的字节数据进行序列化,然后作为参数传递,获取到的数据使用我们之前的解析进行解析就行了
func get(dReq []byte, server string) (body []byte, err error) {
query := strings.Replace(base64.URLEncoding.EncodeToString(dReq), "=", "", -1)
urls := "https://" + server + "/dns-query?dns=" + query
res, err := http.Get(urls)
if err != nil {
return nil, err
}
defer res.Body.Close()
body, err = ioutil.ReadAll(res.Body)
if err != nil {
return nil, err
}
return
}
POST并不需要进行序列化,直接把原始请求数据作为body就行了
这个DNS系列现在有以下几篇文章
DNS EDNS DNSSEC DNS over HTTPS 完整代码请看DNS
注意: 这里我只完成了请求字段,主要原因是因为我学习这些DNS协议是为了找到防止DNS污染的方法,而DNSSEC并不能,而且应答头比较复杂,可能还要了解ssl和tls的知识,所以这里我没有完成代码,想了解的请看protocol change rfc4034 rfc4035 Algorithm
DNSSEC也是使用了EDNS,而且只需要改一个字段,就是之前提到Z,具体协议请看
+0 (MSB) +1 (LSB)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
0: | EXTENDED-RCODE | VERSION |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
2: |DO| Z |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
完成请求头
这个DNS系列现在有以下几篇文章
DNS EDNS DNSSEC DNS over HTTPS 完整代码请看DNS
上一篇我们写了DNS,EDNS就是DNS的功能扩充.
上一篇的DNS里头部有ARCOUNT的计数,EDNS就包含在那个里面,EDNS发送的请求在请求头之后的Additional中,应答在Answer和Authoritative之后,我们可看以下图,跟清晰了吧
+---------------------+
| Header |
+---------------------+
| Question | the question for the name server
+---------------------+
| Answer | RRs answering the question
+---------------------+
| Authority | RRs pointing toward an authority
+---------------------+
| Additional | RRs holding additional information
+---------------------+
查看双显卡
切换情况,正常情况下如果没有在用独显应该显示是DynOff
,但是我这里即使是不开桌面也是DynPwr
[ ~ ] cat /sys/kernel/debug/vgaswitcheroo/switch
0:DIS-Audio: :DynPwr:0000:01:00.1
1:IGD:+:Pwr:0000:00:02.0
2:DIS: :DynPwr:0000:01:00.0
查看dmesg
找到
[ 3.495606] [drm] amdgpu kernel modesetting enabled.
[ 3.495628] vga_switcheroo: detected switching method \_SB_.PCI0.GFX0.ATPX handle
[ 3.495741] ATPX version 1, functions 0x00000033
[ 3.495873] ATPX Hybrid Graphics
找到了调用的方法,网上搜了一圈都没有使用方法,然后使用acpi_call
尝试了几个参数,最后找到
echo "\_SB_.PCI0.GFX0.ATPX 2 0" > /proc/acpi/call
嗯,确实有用,但是实在是太暴力了,直接把整个显卡移除,可以看一下日志