0%

我的应用采用的是ruoyi-vue-pro,无意中发现带了很多http后缀的文件,搜了一下看了日拱一兵 IntelliJ IDEA的这个接口调试工具真是太好用了!这篇blog,知道了是 IntelliJ IDEA 的 HTTP Client,就拿来研究了一下。

新建http client

在idea中新建文件中找到HTTP Request.

截屏2023-01-18 10.50.17

环境变量

注:很多都是拿ruoyi-vue-pro的例子

环境变量需要定义在环境文件中,环境文件有两种:

  1. 创建名为 http-client.env.json 的环境文件(其实里面就是保存 JSON 数据),该文件里可以定义用在整个项目上的所有常规变量
  2. 也可以创建名为http-client.private.env.json, 看文件名你应该也猜到这是保存敏感数据的,比如密码,token等,该文件默认是被加入到 VCS 的 ignore文件中的,同时优先级高于其他环境文件, 也就是说,该文件的变量会覆盖其他环境文件中的变量值

里面的文件内容就像这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"local": {
"baseUrl": "http://127.0.0.1:48080/platform/admin-api",
"token": "test1",
"adminTenentId": "1",

"appApi": "http://127.0.0.1:48080/platform/app-api",
"appToken": "test1",
"appTenentId": "1"
},
"gateway": {
"baseUrl": "http://127.0.0.1:8888/platform/admin-api",
"token": "test1",
"adminTenentId": "1",

"appApi": "http://127.0.0.1:8888/platform/app-api",
"appToken": "test1",
"appTenentId": "1"
}
}

注:下面的用例都是参照日拱一兵 来弄。

使用 response handler 脚本

我们要让登录成功后的所有请求都自动携带成功返回的 Token,这样不用我们每次都手动将其添加到header中,我直接把返回的json信息中的accessToken写入环境变量,就是用’>’开头,后面用类似于模板标签的方式框住 js 脚本

1
2
3
4
5

> {%
client.global.set("token", response.body.data.accessToken);

%}

编辑 HTTP request 文件

我们模拟实际项目中场景来编辑文件

  1. 用户登录,成功后获取 Token,通常是 POST 请求
  2. 用户后续访问行为都要在请求头中携带登录成功返回的 Token

通过点击 Add Request,选择相应的方法就可以编写啦

登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
### 请求 /login 接口 => 成功(无验证码)
POST {{baseUrl}}/system/auth/login
Content-Type: application/json
tenant-id: {{adminTenentId}}

{
"username": "admin",
"password": "admin123"
}

> {%
client.global.set("token", response.body.data.accessToken);
%}

执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
http://{{baseUrl}}/system/auth/login

HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
trace-id:
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 18 Jan 2023 02:43:41 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
"code": 200,
"data": {
"userId": 1,
"accessToken": "85f67291fcb54d65b9dffd35098ceafb",
"refreshToken": "c14484195eec4d8ca0548e22ff6858a5",
"expiresTime": "2023-01-18 11:13:41"
},
"message": ""
}
Response file saved.
> 2023-01-18T104341.200.json

Response code: 200; Time: 138ms; Content length: 180 bytes

然后后续使用这个token

获取权限信息这里需要使用刚才返回的 token

1
2
3
4
5
6
7
8
9
10
11
### 请求 /get-permission-info 接口 => 成功
GET {{baseUrl}}/system/auth/get-permission-info
Authorization: Bearer {{token}}
tenant-id: {{adminTenentId}}

### 请求 /list-menus 接口 => 成功
GET {{baseUrl}}/system/auth/list-menus
Authorization: Bearer {{token}}
#Authorization: Bearer a6aa7714a2e44c95aaa8a2c5adc2a67a
tenant-id: {{adminTenentId}}

执行结果虽然没有显示发送的header,但是可以看到认证成功了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
http://{{baseUrl}}/system/auth/get-permission-info

HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
trace-id:
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Content-Type: application/json
Transfer-Encoding: chunked
Date: Wed, 18 Jan 2023 02:43:56 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{
"code": 200,
"data": {
"user": {
"id": 1,
"nickname": "老王",
"avatar": "http://127.0.0.1:48080/platform/admin-api/infra/file/5/get/ef30195d8b2cd33a1d8233dfe6ea5881ca868b94b5dcf93be8cb78ba5151b8c7.jpg"
},
"roles": [
"common",
"super_admin",
"ACTUATOR"
],
"permissions": [
"",
"infra:config:create",
"bpm:task-assign-rule:create",
"system:user:query",
"system:error-code:query",

完事

到这里基本差不多了,后续对需要测试的接口一个个写就行了,方便的地方就是一直在idea中写,不用打开postman。

以前使用pyenv来管理python版本,最近看到别人用 anaconda,就了解了一下,试着安装。

安装anaconda

从 anaconda 官网 https://www.anaconda.com/products/distribution#macos 下载可视化版本https://repo.anaconda.com/archive/Anaconda3-2022.10-MacOSX-x86_64.pkg,然后安装;安装完后系统多了一个 anaconda-navigator,安装目录是~/opt/anaconda3 ,打开后可以在environments下create新的环境,但是新建的时候python版本不能随便选,由于一直使用python-3.7.10来使用paddle,所以还是得自己手动创建。

1
2
3
4
5
6
7
8
9
10
11
12
 
conda create -n paddle232-py3710 python=3.7.10

#
# To activate this environment, use
#
# $ conda activate paddle232-py3710
#
# To deactivate an active environment, use
#
# $ conda deactivate

创建好后在可视化界面也可以看到。

然后命令行激活

1
2
3
4
5
6
(base) wanghongxing:~ whx$ python -V
Python 3.9.13
(base) wanghongxing:~ whx$ conda activate paddle232-py3710

(paddle232-py3710) wanghongxing:~ whx$ python -V
Python 3.7.10

可以看到,刚开始python是3.9.13,执行 conda activate paddle232-py3710后python版本变成3.7.10

安装paddle2.3.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
(paddle232-py3710) wanghongxing:~ python -m pip install paddlepaddle==2.3.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting paddlepaddle==2.3.2
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/ba/bf/bc6a1dd9a1126d8cd1467917d34bf12c9282152f99afc5b8cad29118eda4/paddlepaddle-2.3.2-cp37-cp37m-macosx_10_6_intel.whl (93.0 MB)
Collecting numpy>=1.13
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/32/dd/43d8b2b2ebf424f6555271a4c9f5b50dc3cc0aafa66c72b4d36863f71358/numpy-1.21.6-cp37-cp37m-macosx_10_9_x86_64.whl (16.9 MB)
Collecting decorator
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl (9.1 kB)
Collecting paddle-bfloat==0.1.7
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/c6/40/65edb5bf459317bdc808f884805784470c9b5ab38b81df23fac02e02f5b8/paddle_bfloat-0.1.7-cp37-cp37m-macosx_10_9_x86_64.whl (44 kB)
Collecting six
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting protobuf<=3.20.0,>=3.1.0
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/be/f0/2633123b475c9ae6e9be25351c7ba6ca3adc223d73789ca2f6f5e4686723/protobuf-3.20.0-cp37-cp37m-macosx_10_9_x86_64.whl (961 kB)
Collecting astor
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/c3/88/97eef84f48fa04fbd6750e62dcceafba6c63c81b7ac1420856c8dcc0a3f9/astor-0.8.1-py2.py3-none-any.whl (27 kB)
Collecting Pillow
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/91/1d/57a09a69508a27c1c6caa4197ce7fac5be5b7d736889ba1a20931ff4efca/Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl (3.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 14.4 MB/s eta 0:00:00
Collecting opt-einsum==3.3.0
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/bc/19/404708a7e54ad2798907210462fd950c3442ea51acc8790f3da48d2bee8b/opt_einsum-3.3.0-py3-none-any.whl (65 kB)
Collecting requests>=2.20.0
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/ca/91/6d9b8ccacd0412c08820f72cebaa4f0c0441b5cda699c90f618b6f8a1b42/requests-2.28.1-py3-none-any.whl (62 kB)
Collecting idna<4,>=2.5
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl (61 kB)
Collecting urllib3<1.27,>=1.21.1
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/65/0c/cc6644eaa594585e5875f46f3c83ee8762b647b51fc5b0fb253a242df2dc/urllib3-1.26.13-py2.py3-none-any.whl (140 kB)
Collecting charset-normalizer<3,>=2
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/db/51/a507c856293ab05cdc1db77ff4bc1268ddd39f29e7dc4919aa497f0adbec/charset_normalizer-2.1.1-py3-none-any.whl (39 kB)
Requirement already satisfied: certifi>=2017.4.17 in ./opt/anaconda3/envs/paddle232-py3710/lib/python3.7/site-packages (from requests>=2.20.0->paddlepaddle==2.3.2) (2022.12.7)
Installing collected packages: paddle-bfloat, urllib3, six, protobuf, Pillow, numpy, idna, decorator, charset-normalizer, astor, requests, opt-einsum, paddlepaddle
Successfully installed Pillow-9.4.0 astor-0.8.1 charset-normalizer-2.1.1 decorator-5.1.1 idna-3.4 numpy-1.21.6 opt-einsum-3.3.0 paddle-bfloat-0.1.7 paddlepaddle-2.3.2 protobuf-3.20.0 requests-2.28.1 six-1.16.0 urllib3-1.26.13

(paddle232-py3710) wanghongxing:~ whx$ which paddle
/Users/whx/opt/anaconda3/envs/paddle232-py3710/bin/paddle
(paddle232-py3710) wanghongxing:~ whx$ paddle version
<stdin>:3: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
PaddlePaddle 2.3.2, compiled with
with_avx: ON
with_gpu: OFF
with_mkl: OFF
with_mkldnn: OFF
with_python: ON


安装paddle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

(paddle232-py3710) wanghongxing:guyuai-emotion-train whx$ pip3 install paddle
Collecting paddle
Using cached paddle-1.0.2.tar.gz (579 kB)
Preparing metadata (setup.py) ... error
error: subprocess-exited-with-error

× python setup.py egg_info did not run successfully.
exit code: 1
╰─> [8 lines of output]
Traceback (most recent call last):
File "<string>", line 36, in <module>
File "<pip-setuptools-caller>", line 34, in <module>
File "/private/var/folders/6d/lxb9s6557cx2wq_2fs6s2_bm0000gr/T/pip-install-h1m6_55m/paddle_d36d8dad2117474f8fc2aaa140c6ac30/setup.py", line 3, in <module>
import paddle
File "/private/var/folders/6d/lxb9s6557cx2wq_2fs6s2_bm0000gr/T/pip-install-h1m6_55m/paddle_d36d8dad2117474f8fc2aaa140c6ac30/paddle/__init__.py", line 5, in <module>
import common, dual, tight, data, prox
ModuleNotFoundError: No module named 'common'
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

然后手动安装依赖包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pip install common
pip install dual
pip install tight
pip install data
pip install prox

(paddle232-py3710) wanghongxing:guyuai-emotion-train whx$ pip3 install paddle==1.0.2
Collecting paddle==1.0.2
Using cached paddle-1.0.2.tar.gz (579 kB)
Preparing metadata (setup.py) ... done
Building wheels for collected packages: paddle
Building wheel for paddle (setup.py) ... done
Created wheel for paddle: filename=paddle-1.0.2-py3-none-any.whl size=33366 sha256=63916ce0eea092ef9e690f3e992b51f32f955eabc66070be6e9feba60d672973
Stored in directory: /Users/whx/Library/Caches/pip/wheels/e2/38/0e/382f68d54c6949b370f1438aa96172ff44a8ed367134cce32e
Successfully built paddle
Installing collected packages: paddle
Successfully installed paddle-1.0.2


安装完后仍然执行异常,没办法,删除rm -rf ~/opt/anaconda3,重新下载命令行版本,下载地址https://repo.anaconda.com/archive/Anaconda3-2022.10-MacOSX-x86_64.sh

1
2
3
4
5
6
bash Anaconda3-2022.10-MacOSX-x86_64.sh
conda create -n paddle232-py3710 python=3.7.10
conda activate paddle232-py3710
pip install paddle==1.0.2
python -m pip install paddlepaddle==2.3.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

这时候 paddle2.3.2 环境正常。

1
2
arch -x86_64 bash

ipfs 搭建私有网络 作为服务运行

主节点:whx: 192.168.33.10

worker: 192.168.33.21

下载:

1
wget https://github.com/ipfs/go-ipfs/releases/download/v0.7.0/go-ipfs_v0.7.0_linux-amd64.tar.gz

解压缩 tar xzf go-ipfs_v0.7.0_linux-amd64.tar.gz

切换root,两个节点都执行

初始化:

1
2
3
4
5
cd go-ipfs
sudo bash install.sh
cp /usr/local/bin/ipfs /usr/bin/ipfs
ipfs --version
/usr/local/bin/ipfs init

主节点:

安装golang

1
2
3
yum install epel-release
yum install go

创建共享key

1
2
3
4
5
6
7
8
9
10
11
12
# go get github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
# go/bin/ipfs-swarm-key-gen > /root/.ipfs/swarm.key
# ipfs bootstrap rm all
# ipfs id
{
"ID": "12D3KooWNvmkBW5noeQLzEpSpktYSZjq69727Z9e9F1sEJtuwJEb",
"PublicKey": "CAESIMLMEqwfQn4BGZEcmH9ch+Oz93YYWqg//+i5/2dG26nI",
"Addresses": null,
"AgentVersion": "go-ipfs/0.7.0/",
"ProtocolVersion": "ipfs/0.1.0",
"Protocols": null
}

worker节点复制swarm.key,然后

1
2
3
ipfs bootstrap rm all
ipfs bootstrap add /ip4/192.168.33.10/tcp/4001/ipfs/12D3KooWNvmkBW5noeQLzEpSpktYSZjq69727Z9e9F1sEJtuwJEb

两台服务器都把ipfs作为服务

1
2
cd /lib/systemd/system
vi ipfs.service
1
2
3
4
5
6
7
8
9
[Unit]
Description=IPFS
[Service]
ExecStart=/usr/local/bin/ipfs daemon
Restart=always
User=root
Group=root
[Install]
WantedBy=multi-user.target

启用服务:

systemctl enable ipfs.service

systemctl start ipfs.service

systemctl status ipfs.service

测试

1
2
3
4
5
6
7
8
9
10
11
echo "from whx "> whx.txt

# ipfs add whx.txt
added QmYkeyhAYTaWdizfFEno2EtBTRdjazcSwYnhTWt4q7L5zU whx.txt
# ipfs cat /ipfs/QmYkeyhAYTaWdizfFEno2EtBTRdjazcSwYnhTWt4q7L5zU
from whx

# echo "from test3">test.txt
# ipfs add test.txt
added QmXazQTUuAoiXEDqoCd4eF9g5okoMHWE2KMtAviS3dQ7h2 test.txt

添加一个目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# tree test
test
├── index.html
├── sub
│   └── sub.html
└── test.html
# ipfs add -r test
added QmQV4SEvUf8UhLmf7bsjx97jtY4Pw1XBk2be2GUdyxRTMx test/index.html
added QmRxqKo5fUnpNPzvWcPnBZfkV9533bqZLBzRWFeWtkjbME test/sub/sub.html
added QmbNyHGiz83bNbUnyNjXTjr1pm8AhD5XHyhQfS6iLiwBT1 test/test.html
added QmZicCMMw7xfcbMHbZ1hNJ1n9om1jDFywdjQFXEkGwGQMW test/sub
added QmWBEkwUxHL81GScHYcKdMio7PBzJDNRHZxUpc8uRFdyQT test

# ipfs ls /ipfs/QmWBEkwUxHL81GScHYcKdMio7PBzJDNRHZxUpc8uRFdyQT/
QmQV4SEvUf8UhLmf7bsjx97jtY4Pw1XBk2be2GUdyxRTMx 20 index.html
QmZicCMMw7xfcbMHbZ1hNJ1n9om1jDFywdjQFXEkGwGQMW - sub/
QmbNyHGiz83bNbUnyNjXTjr1pm8AhD5XHyhQfS6iLiwBT1 20 test.html


# echo "aaaa" >test\sub\test.txt
# ipfs add -r test
added QmQV4SEvUf8UhLmf7bsjx97jtY4Pw1XBk2be2GUdyxRTMx test/index.html
added QmRxqKo5fUnpNPzvWcPnBZfkV9533bqZLBzRWFeWtkjbME test/sub/sub.html
added QmbxCEbzgQZmy38pew5Wy6cbfiefW8z3vGbepZuZzcgchP test/sub/test1.txt
added QmbNyHGiz83bNbUnyNjXTjr1pm8AhD5XHyhQfS6iLiwBT1 test/test.html
added QmWR5PNWprgGfnYS9t3MUZGV1YtYifWkebgrh7UB6Zi3xD test/sub
added QmeoLK9ZsQK9zroLjb7HNxhyqE37ieL66uFnLRJoWD4bxL test

# ipfs ls /ipfs/QmeoLK9ZsQK9zroLjb7HNxhyqE37ieL66uFnLRJoWD4bxL
QmQV4SEvUf8UhLmf7bsjx97jtY4Pw1XBk2be2GUdyxRTMx 20 index.html
QmWR5PNWprgGfnYS9t3MUZGV1YtYifWkebgrh7UB6Zi3xD - sub/
QmbNyHGiz83bNbUnyNjXTjr1pm8AhD5XHyhQfS6iLiwBT1 20 test.html

注意到两次的不同

1
2
3
4
5
6
7
8
9
10
QmZicCMMw7xfcbMHbZ1hNJ1n9om1jDFywdjQFXEkGwGQMW -  sub/

QmWR5PNWprgGfnYS9t3MUZGV1YtYifWkebgrh7UB6Zi3xD - sub/

# ipfs ls QmZicCMMw7xfcbMHbZ1hNJ1n9om1jDFywdjQFXEkGwGQMW
QmRxqKo5fUnpNPzvWcPnBZfkV9533bqZLBzRWFeWtkjbME 21 sub.html

# ipfs ls QmWR5PNWprgGfnYS9t3MUZGV1YtYifWkebgrh7UB6Zi3xD
QmRxqKo5fUnpNPzvWcPnBZfkV9533bqZLBzRWFeWtkjbME 21 sub.html
QmbxCEbzgQZmy38pew5Wy6cbfiefW8z3vGbepZuZzcgchP 10 test1.txt

绑定节点名 publish

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ipfs name publish QmeoLK9ZsQK9zroLjb7HNxhyqE37ieL66uFnLRJoWD4bxL
Published to k51qzi5uqu5dk53t2hi2f8dhupwl2kkxypggp4dd7svxkxirwg411zfthqn08e: /ipfs/QmeoLK9ZsQK9zroLjb7HNxhyqE37ieL66uFnLRJoWD4bxL
# ipfs cat /ipns/k51qzi5uqu5dk53t2hi2f8dhupwl2kkxypggp4dd7svxkxirwg411zfthqn08e/index.html
index.html from test

# echo "index.html version new" >test/index.html
# ipfs add -r test
added QmNZt9aFJHtggpXupw2VjsvZ1RksV7AfjhLgBSSN5q9a51 test/index.html
added QmRxqKo5fUnpNPzvWcPnBZfkV9533bqZLBzRWFeWtkjbME test/sub/sub.html
added QmbxCEbzgQZmy38pew5Wy6cbfiefW8z3vGbepZuZzcgchP test/sub/test1.txt
added QmbNyHGiz83bNbUnyNjXTjr1pm8AhD5XHyhQfS6iLiwBT1 test/test.html
added QmWR5PNWprgGfnYS9t3MUZGV1YtYifWkebgrh7UB6Zi3xD test/sub
added QmbwhfHfarbU3X9wa8ovtK7Q4fGkd8R3B8biH4kUD7CmuU test
# ipfs name publish QmbwhfHfarbU3X9wa8ovtK7Q4fGkd8R3B8biH4kUD7CmuU
Published to k51qzi5uqu5dk53t2hi2f8dhupwl2kkxypggp4dd7svxkxirwg411zfthqn08e: /ipfs/QmbwhfHfarbU3X9wa8ovtK7Q4fGkd8R3B8biH4kUD7CmuU
# ipfs cat /ipns/k51qzi5uqu5dk53t2hi2f8dhupwl2kkxypggp4dd7svxkxirwg411zfthqn08e/index.html
index.html version new

节点直接不能互相发现,这是因为swarm announce的ip 不固定,多网卡的情况下回在虚拟机里绑定到docker网卡,修改方法是修改.ipfs/config

1
2
3
4
5
6
7
{
"Addresses": {
"Announce": [
"/ip4/1.2.3.4/tcp/4001",
]
}
}

下载webui

https://github.com/ipfs-shipyard/ipfs-webui/releases/download/v2.11.1/ipfs-webui.tar.gz

1
2
3
4
# tar zxf ipfs-webui.tar.gz
# ipfs add -r build
added QmaFK9e6DjMuqnsi9hDJoJb6E1iFxJaHHWiKUoUpVjeg7h build/static
added QmZtzPm6EgQToncp6RuHdaTtyPpWQy2gvTrXuMsYQxHV5k build
1
2
3
4
5
6
7
# ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://bafybeiflxftai7lnntipulvvmn3vfcs3ktig4kgzxollh276zqmchxz6cm.ipfs.localhost:8080", "http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
# ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]'

# curl -v http://localhost:8080/ipfs/QmZtzPm6EgQToncp6RuHdaTtyPpWQy2gvTrXuMsYQxHV5k
< Location: http://bafybeiflxftai7lnntipulvvmn3vfcs3ktig4kgzxollh276zqmchxz6cm.ipfs.localhost:8080/
echo "127.0.0.1 bafybeiflxftai7lnntipulvvmn3vfcs3ktig4kgzxollh276zqmchxz6cm.ipfs.localhost">>/etc/hosts

访问如下地址

http://bafybeiflxftai7lnntipulvvmn3vfcs3ktig4kgzxollh276zqmchxz6cm.ipfs.localhost:8080/#/welcome


ipfs key

1
2
# ipfs key list -l
k51qzi5uqu5dk53t2hi2f8dhupwl2kkxypggp4dd7svxkxirwg411zfthqn08e self

云端服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# ipfs id
{
"ID": "12D3KooWDiAhxybZwdsdHrnjogpbdnKuBPDSFn883cwyDpJb5hiZ",
"PublicKey": "CAESIDnYTZXIdT2889xegXXVgnDQwTx9GuoY/FKXqOYBGU8q",
"Addresses": [
"/ip4/127.0.0.1/tcp/4001/p2p/12D3KooWDiAhxybZwdsdHrnjogpbdnKuBPDSFn883cwyDpJb5hiZ",
"/ip4/192.168.1.16/tcp/4001/p2p/12D3KooWDiAhxybZwdsdHrnjogpbdnKuBPDSFn883cwyDpJb5hiZ",
"/ip6/::1/tcp/4001/p2p/12D3KooWDiAhxybZwdsdHrnjogpbdnKuBPDSFn883cwyDpJb5hiZ"
],
"AgentVersion": "go-ipfs/0.7.0/",
"ProtocolVersion": "ipfs/0.1.0",
"Protocols": [
"/ipfs/bitswap",
"/ipfs/bitswap/1.0.0",
"/ipfs/bitswap/1.1.0",
"/ipfs/bitswap/1.2.0",
"/ipfs/id/1.0.0",
"/ipfs/id/push/1.0.0",
"/ipfs/lan/kad/1.0.0",
"/ipfs/ping/1.0.0",
"/libp2p/autonat/1.0.0",
"/libp2p/circuit/relay/0.1.0",
"/p2p/id/delta/1.0.0",
"/x/"
]
}

在服务器安装节点

1
2
3
114.115.210.207
114.115.212.160
119.3.165.66

然后再所有内网节点加入前两个节点,不加入第三个节点

1
2
3
4
ipfs bootstrap add /ip4/114.115.210.207/tcp/4001/ipfs/12D3KooWDiAhxybZwdsdHrnjogpbdnKuBPDSFn883cwyDpJb5hiZ
ipfs bootstrap add /ip4/114.115.212.160/tcp/4001/ipfs/12D3KooWART3DbX2qT93YjPzBxyEVLqaFSoH9rm6Wt9ZZE2VwErh


然后在内网节点添加文件,不在两台bootstrap中查看,在第三台上不能看到文件。

在两台bootstrap中的任意一台查看过文件后,可以在第三台上看到。

结论:内网的文件需要在外网服务器上pin后,才能在别的节点查看。

todo:在一台nat后的服务器上添加文件,研究其它节点的情况。


研究nodejs版本的各个例子

browser-http-client-upload-file:

启动后点击查看的时候会把http://localhost:8080/ipfs/Qmb3b88paN4AocnjyTNCpRqh2CsbskhvoLbE7o6BhHmD85

重定向到

http://Qmb3b88paN4AocnjyTNCpRqh2CsbskhvoLbE7o6BhHmD85.ipfs .localhost:8080/ipfs/

修改配置文件后不跳转了,

1
2
3
4
5
6
ipfs config --json Gateway.PublicGateways '{
"localhost:8080": {
"UseSubdomains": false,
"Paths": ["/ipfs", "/ipns", "/api"]
}
}'

浏览器直接访问ipfs api 的时候报access-control-allow 错,添加配置后重启ipfs即可

1
2
3
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials '["true"]'

1
2
3
echo "a">test.txt
echo "b">test2.txt
echo "c">test3.txt

master:

1
2
3
4
5
6
7
8
9
10
11
12
13
# ipfs --api /ip4/127.0.0.1/tcp/9095 add test3.txt
added QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 test3.txt

# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

# ipfs-cluster-ctl pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 | | PIN | Repl. Factor: -1 | Allocations: [everywhere] | Recursive | Metadata: no | Exp: ∞

#ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

注:QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn 是一个空的文件目录,每个初始化的节点都有。

在另外两台服务器上都执行 pin ls,

1
2
3
4
5
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive
# ipfs pin ls
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

说明使用cluster add的时候在所有的节点都已经同步保存了。

whx:

1
2
3
4
5
6
7
8
9
10
11
# ipfs add test.txt
added Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 test.txt

# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

# ipfs pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive

说明普通的add命令只在本机pin

whx:

1
2
3
4
5
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin add Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9
pinned Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursively
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive

在另外两台服务器上都执行 pin ls,

1
2
3
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

说明使用 ipfs add 以后需要用 cluster 的 pin add 来让 cluster 保存了。

whx:

1
2
3
4
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin rm  Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9
unpinned Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

执行删除操作后,pin ls看不到该文件了。

master:

1
2
3
4
5
6
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin add Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9
pinned Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursively

# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

在master上执行pin add 后该文件又出现了。(难到这个在存储里还有,重新pin add 后又出现了)

worker:

1
2
3
4
5
6
7
8
9
10
11
# ipfs add test2.txt
added QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM test2.txt
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive
# ipfs pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive
QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM recursive
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive

whx:

1
2
3
4
5
6
# ipfs cat QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
b
# ipfs pin ls
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive
QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn recursive
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive

说明可以看不同节点增加的文件,但是并没有pin。

whx:

1
2
3
4
5
6
7
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin add QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
pinned QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM recursively
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM recursive
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive

在任意一台服务器上

1
2
3
4
5
6
7
8
9
10
11
12

# ipfs --api /ip4/127.0.0.1/tcp/9095 cat QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
b
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin rm QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
unpinned QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
# ipfs --api /ip4/127.0.0.1/tcp/9095 cat QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
b
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin ls
Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9 recursive
QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7 recursive
# ipfs cat QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
b

这时候删除了都能看,然后在一台清除gc

1
2
3
4
5
6
7
8
9
10
11
12
# ipfs repo gc
removed QmWLX2v5rnFeAbFyP4VPkDKLVVk91LncD6S648Ce4GgGgz
removed QmevuAKVMG3Pr6nTp2oy9MzuPhZuZMxRfFApbfzk5zafr6
removed QmV7XXZAUrBaE76Susmd4gRLzziK5QH1EigHqgma8adKf9
removed QmWgtt1onrFVgqwAuYBWQ2HNkxJtBgnDzqWRVZQzpWeDUj
removed QmWNGqp2zsw6nLr6aySK3UAQkTkoYozMNszwcz1bWmuckX
removed QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
removed QmT9PmBnECcLRCu4hYmbijCca6k7ocdagGqUFpH9gWf5Cn
removed QmaoaDnyHfZYEXjCuX59bgzA2YbgXMUKuSARdS3GHgbxoN
# ipfs cat QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
b

一台上清除gc后依然能看,下面在所有服务器上清除

1
2
3
4
5
6
7
8
9
10
11
# ipfs repo gc
removed QmWLX2v5rnFeAbFyP4VPkDKLVVk91LncD6S648Ce4GgGgz
removed QmevuAKVMG3Pr6nTp2oy9MzuPhZuZMxRfFApbfzk5zafr6
removed QmV7XXZAUrBaE76Susmd4gRLzziK5QH1EigHqgma8adKf9
removed QmWgtt1onrFVgqwAuYBWQ2HNkxJtBgnDzqWRVZQzpWeDUj
removed QmWNGqp2zsw6nLr6aySK3UAQkTkoYozMNszwcz1bWmuckX
removed QmPphhXAJkNKktecNqsbRf3zXXdsSA4fM9DS4LMaWFmbti
removed QmR9pC5uCF3UExca8RSrCVL8eKv7nHMpATzbEQkAHpXmVM
removed QmT9PmBnECcLRCu4hYmbijCca6k7ocdagGqUFpH9gWf5Cn
removed QmaoaDnyHfZYEXjCuX59bgzA2YbgXMUKuSARdS3GHgbxoN

清除完以后就看不到文件了,说明只要gc还没有清除,文件就都还能看。


测试 replication_factor_minreplication_factor_max

~/.ipfs-cluster/service.json 文件中 replication_factor_minreplication_factor_max 均为默认值 -1

集群中每个节点都存了一份文件副本。这不是我们想要的,需要继续实验如何控制副本数。

修改 ~/.ipfs-cluster/service.json 文件中的两个配置项: replication_factor_minreplication_factor_max

  • replication_factor_min 代表存储该文件的集群最小节点数,可以理解为副本数下线,-1 代表全部。本次实验中设置为 1.
  • replication_factor_max 代表存储该文件的集群最大阶段属,可以理解为副本数上限,-1 代表全部。本次实验中设置为 1.
1
2
3
4
5
6
7
jq ".cluster.replication_factor_min = 2" ${IPFS_CLUSTER_PATH}/service.json |jq ".cluster.replication_factor_max = 3" > ${IPFS_CLUSTER_PATH}/tmp.service.json
mv -f ${IPFS_CLUSTER_PATH}/tmp.service.json ${IPFS_CLUSTER_PATH}/service.json
grep replication_factor ${IPFS_CLUSTER_PATH}/service.json
systemctl restart ipfs-cluster
systemctl status ipfs-cluster


随机生成100M的大文件

1
2
3
dd if=/dev/urandom of=test1.file count=100000 bs=1024
dd if=/dev/urandom of=test2.file count=100000 bs=1024
dd if=/dev/urandom of=test3.file count=100000 bs=1024

添加文件并查看ipfs存储

1
2
3
4
5
# ipfs --api /ip4/127.0.0.1/tcp/9095 add test1.file
added QmaVdYFJP88SzYtDayfiU4xbzCTmStmB6Ug4ihtJV7Nzgg test1.file
# du -sh /data/*
101M /data/ipfs
44K /data/ipfs-cluster

所有三台服务器上存储内容一致.

清理所有存储

1
2
3
4
5
6
7
8
9
10
11
12
13
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin rm QmVFxmvDaBBGBFUMPLSRL9mb4N6Xm8xEYnCuy5m85gPAaP
unpinned QmVFxmvDaBBGBFUMPLSRL9mb4N6Xm8xEYnCuy5m85gPAaP
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin rm QmavpLffUr1iY2QfhsbMoHrm9tb8rrjoPGP8erwFW2M3tX
unpinned QmavpLffUr1iY2QfhsbMoHrm9tb8rrjoPGP8erwFW2M3tX
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin rm QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7
unpinned QmetGxZTgo8tYAKQH1KLsY13MxqeVHbxYVmvzBzJAKU6Z7
# ipfs --api /ip4/127.0.0.1/tcp/9095 pin rm Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9
unpinned Qmbvkmk9LFsGneteXk3G7YLqtLVME566ho6ibaQZZVHaC9
# ipfs repo gc
# du -sh /data/*
352K /data/ipfs
48K /data/ipfs-cluster

重新设定复制因子

1
2
3
4
5
6
7
jq ".cluster.replication_factor_min = 1" ${IPFS_CLUSTER_PATH}/service.json |jq ".cluster.replication_factor_max = 2" > ${IPFS_CLUSTER_PATH}/tmp.service.json
mv -f ${IPFS_CLUSTER_PATH}/tmp.service.json ${IPFS_CLUSTER_PATH}/service.json
grep replication_factor ${IPFS_CLUSTER_PATH}/service.json
systemctl restart ipfs-cluster
systemctl status ipfs-cluster


添加文件并查看ipfs存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

whx: # ipfs --api /ip4/127.0.0.1/tcp/9095 add test1.file
added QmaVdYFJP88SzYtDayfiU4xbzCTmStmB6Ug4ihtJV7Nzgg test1.file

whx: # du -sh /data/*
100M /data/ipfs
68K /data/ipfs-cluster

master: # du -hs /data/*
101M /data/ipfs
68K /data/ipfs-cluster

worker: # du -hs /data/*
972K /data/ipfs
68K /data/ipfs-cluster

添加第二个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
whx: # ipfs --api /ip4/127.0.0.1/tcp/9095 add test2.file
added QmNzEZywMY6M79wZ6TWuaUU5LFfGDgiqxbrF6mxMdJnjjY test2.file
whx: # du -hs /data/*
200M /data/ipfs
68K /data/ipfs-cluster

worker : # du -hs /data/*
101M /data/ipfs
68K /data/ipfs-cluster

master: # du -hs /data/*
101M /data/ipfs
68K /data/ipfs-cluster

结论:每个文件保存了两份

在master上新增文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
master: # ipfs --api /ip4/127.0.0.1/tcp/9095 add test3.file

whx: # du -hs /data/*
200M /data/ipfs
68K /data/ipfs-cluster

worker: # du -hs /data/*
200M /data/ipfs
68K /data/ipfs-cluster

master: # du -hs /data/*
200M /data/ipfs
68K /data/ipfs-cluster

这时候三台服务器持平

在worker上操作:

1
2
3
4
5
6
7
8
dd if=/dev/urandom of=test4.file count=100000 bs=1024
dd if=/dev/urandom of=test5.file count=100000 bs=1024
dd if=/dev/urandom of=test6.file count=100000 bs=1024
ipfs --api /ip4/127.0.0.1/tcp/9095 add test4.file
ipfs --api /ip4/127.0.0.1/tcp/9095 add test5.file
ipfs --api /ip4/127.0.0.1/tcp/9095 add test6.file


完成后所有服务器存储容量一致:

1
2
3
# du -hs /data/*
399M /data/ipfs
72K /data/ipfs-cluster

继续增加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dd if=/dev/urandom of=test7.file count=100000 bs=1024
dd if=/dev/urandom of=test8.file count=100000 bs=1024
ipfs --api /ip4/127.0.0.1/tcp/9095 add test7.file
ipfs --api /ip4/127.0.0.1/tcp/9095 add test8.file

whx: # du -hs /data/*
598M /data/ipfs
76K /data/ipfs-cluster
worker: # du -hs /data/*
500M /data/ipfs
76K /data/ipfs-cluster
master: # du -hs /data/*
499M /data/ipfs
76K /data/ipfs-cluster

说明cluster尽量在节点之间保持平衡


使用ipfs-cluster-ctl添加

1
2
3
4
5
6
7
8
9
10
11
12
# dd if=/dev/urandom of=test9.file count=100000 bs=1024
# ipfs-cluster-ctl add --rmin 1 --rmax 1 test9.file
added QmdTZ9vhg9ocqgPE7frdYGAZHFkF8cYM51dLWzxx9y4nSW test9.file
whx: # du -hs /data/*
598M /data/ipfs
76K /data/ipfs-cluster
worker: # du -hs /data/*
500M /data/ipfs
76K /data/ipfs-cluster
master: # du -hs /data/*
599M /data/ipfs
76K /data/ipfs-cluster

单独增加一个后,增加到master

继续

1
2
3
4
5
6
7
8
9
10
11
12
# dd if=/dev/urandom of=test10.file count=100000 bs=1024
# ipfs-cluster-ctl add --rmin 1 --rmax 1 test10.file
added QmeNha17eq2MfJugthsu9KWdcb18aGKjHbP6LV5rJzXjYo test10.file
whx: # du -hs /data/*
598M /data/ipfs
76K /data/ipfs-cluster
worker: # du -hs /data/*
600M /data/ipfs
76K /data/ipfs-cluster
master: # du -hs /data/*
599M /data/ipfs
76K /data/ipfs-cluster

这时候所有服务器存储容量保持平衡。


测试别的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ipfs add usage-ipfs.txt
added Qmefd5f3y8z7SDyr9SrTeGZvWYueAJaijmmfCBYxFEdwhx usage-ipfs.txt
# ipfs-cluster-ctl pin add --name whx --replication 1 Qmefd5f3y8z7SDyr9SrTeGZvWYueAJaijmmfCBYxFEdwhx
Qmefd5f3y8z7SDyr9SrTeGZvWYueAJaijmmfCBYxFEdwhx | whx:
> whx : PINNED | 2021-05-13T06:19:34.061276362Z
> 12D3KooWDWcqJD1y6JtSByN1N8zRphLkc7UbFvhd1BeKpG9MxdPe : REMOTE | 2021-05-13T06:19:34.065641318Z
> 12D3KooWNTfChtCFYH8kHkrMQttJcFTKRXrFbg6yMFN6uGt3fpWV : REMOTE | 2021-05-13T06:19:34.065641318Z

# ipfs-cluster-ctl pin ls Qmefd5f3y8z7SDyr9SrTeGZvWYueAJaijmmfCBYxFEdwhx
Qmefd5f3y8z7SDyr9SrTeGZvWYueAJaijmmfCBYxFEdwhx | whx | PIN | Repl. Factor: 1--1 | Allocations: [12D3KooWAdivuLNnoka4H3hNRCjnHxeBNVhUBwQ1YR1HBmUnjLTT] | Recursive | Metadata: no | Exp: ∞

# ipfs-cluster-ctl status Qmefd5f3y8z7SDyr9SrTeGZvWYueAJaijmmfCBYxFEdwhx
Qmefd5f3y8z7SDyr9SrTeGZvWYueAJaijmmfCBYxFEdwhx | whx:
> whx : PINNED | 2021-05-13T06:27:04.864319281Z
> 12D3KooWDWcqJD1y6JtSByN1N8zRphLkc7UbFvhd1BeKpG9MxdPe : REMOTE | 2021-05-13T06:27:04.864091368Z
> 12D3KooWNTfChtCFYH8kHkrMQttJcFTKRXrFbg6yMFN6uGt3fpWV : REMOTE | 2021-05-13T06:27:04.864091368Z


测试curl方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# curl -X POST "http://127.0.0.1:4001/api/v0/pin/ls" |jq
{
"Keys": {
"QmNzEZywMY6M79wZ6TWuaUU5LFfGDgiqxbrF6mxMdJnjjY": {
"Type": "recursive"
}
}

# curl -X POST "http://127.0.0.1:9095/api/v0/pin/ls" |jq
{
"Keys": {
"QmNzEZywMY6M79wZ6TWuaUU5LFfGDgiqxbrF6mxMdJnjjY": {
"Type": "recursive"
}
}

curl -X GET "http://127.0.0.1:9094/id"
curl -X GET "http://127.0.0.1:9094/version"
curl -X GET "http://127.0.0.1:9094/peers"
curl -X GET "http://127.0.0.1:9094/pins"

curl -X POST "http://127.0.0.1:9094/add"

curl -X GET "http://127.0.0.1:9094/pins/QmQcCo8MqRjAwUMeZCcALb91aZc9NFCswPwakQbgQb5oH9"

add method param

1
2
3
4
replication
name
mode

1
2
3
4
ipfs --api /ip4/127.0.0.1/tcp/9095 cat




As a final tip, this table provides a quick summary of methods available.

METHOD ENDPOINT COMMENT
GET /id Cluster peer information
GET /version Cluster version
GET /peers Cluster peers
DELETE /peers/{peerID} Remove a peer
POST /add Add content to the cluster
GET /allocations List of pins and their allocations (pinset)
GET /allocations/{cid} Show a single pin and its allocations (from the pinset)
GET /pins Local status of all tracked CIDs
POST /pins/sync Sync local status from IPFS
GET /pins/{cid} Local status of single CID
POST /pins/{cid} Pin a CID
POST /pins/{ipfs|ipns|ipld}/<path> Pin using an IPFS path
DELETE /pins/{cid} Unpin a CID
DELETE /pins/{ipfs|ipns|ipld}/<path> Unpin using an IPFS path
POST /pins/{cid}/sync Sync a CID
POST /pins/{cid}/recover Recover a CID
POST /pins/recover Recover all pins in the receiving Cluster peer
GET /monitor/metrics Get a list of metric types known to the peer
GET /monitor/metrics/{metric} Get a list of current metrics seen by this peer
GET /health/alerts Display a list of alerts (metric expiration events)
GET /health/graph Get connection graph
GET /health/alerts Get connection graph
POST /ipfs/gc Perform GC in the IPFS nodes

openssl升级

编译安装了

1
2
./config --prefix=/usr/local/openssl // 指定安装路径
make && make install

最后替换当前系统的旧版本 openssl 「先保存原来的」

1
2
3
4
5
6
7
8
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/lib64/openssl /usr/lib64/openssl.old
mv /usr/lib64/libssl.so /usr/lib64/libssl.so.old
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
ln -s /usr/local/openssl/lib/libssl.so /usr/lib64/libssl.so
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v

最后查看当前系统 openssl 版本

1
openssl version

firewall

配置firewalld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

firewall-cmd --version # 查看版本
firewall-cmd --help # 查看帮助

# 查看设置:
firewall-cmd --state # 显示状态
firewall-cmd --get-active-zones # 查看区域信息
firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域
firewall-cmd --panic-on # 拒绝所有包
firewall-cmd --panic-off # 取消拒绝状态
firewall-cmd --query-panic # 查看是否拒绝

firewall-cmd --reload # 更新防火墙规则
firewall-cmd --complete-reload
# 两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务


# 将接口添加到区域,默认接口都在public
firewall-cmd --zone=public --add-interface=eth0
# 永久生效再加上 --permanent 然后reload防火墙

# 设置默认接口区域,立即生效无需重启
firewall-cmd --set-default-zone=public

# 查看所有打开的端口:
firewall-cmd --zone=dmz --list-ports

# 加入一个端口到区域:
firewall-cmd --zone=dmz --add-port=8080/tcp
# 若要永久生效方法同上

# 打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹,这个不详细说了,详情参考文档
firewall-cmd --zone=work --add-service=smtp

# 移除服务
firewall-cmd --zone=work --remove-service=smtp

# 显示支持的区域列表
firewall-cmd --get-zones

# 设置为家庭区域
firewall-cmd --set-default-zone=home

# 查看当前区域
firewall-cmd --get-active-zones

# 设置当前区域的接口
firewall-cmd --get-zone-of-interface=enp03s

# 显示所有公共区域(public)
firewall-cmd --zone=public --list-all

# 临时修改网络接口(enp0s3)为内部区域(internal)
firewall-cmd --zone=internal --change-interface=enp03s

# 永久修改网络接口enp03s为内部区域(internal)
firewall-cmd --permanent --zone=internal --change-interface=enp03s


服务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 显示服务列表  
Amanda, FTP, Samba和TFTP等最重要的服务已经被FirewallD提供相应的服务,可以使用如下命令查看:

firewall-cmd --get-services

# 允许SSH服务通过
firewall-cmd --new-service=ssh

# 禁止SSH服务通过
firewall-cmd --delete-service=ssh

# 打开TCP的8080端口
firewall-cmd --enable ports=8080/tcp

# 临时允许Samba服务通过600秒
firewall-cmd --enable service=samba --timeout=600

# 显示当前服务
firewall-cmd --list-services

# 添加HTTP服务到内部区域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload # 在不改变状态的条件下重新加载防火墙


端口管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 打开443/TCP端口
firewall-cmd --add-port=443/tcp --permanent

# 永久打开3690/TCP端口
firewall-cmd --permanent --add-port=3690/tcp --permanent

# 永久打开端口好像需要reload一下,临时打开好像不用,如果用了reload临时打开的端口就失效了
# 其它服务也可能是这样的,这个没有测试
firewall-cmd --reload

# 查看防火墙,添加的端口也可以看到
firewall-cmd --list-all


all

1
2
3
4
5
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=7002/tcp --permanent

zone

增加一个zone

1
firewall-cmd --new-zone=zgcw-access --permanent

增加ip和端口

gateway

1
2
3
4
5
6
firewall-cmd --zone=zgcw-access --add-source=172.17.100.0/24 --permanent
firewall-cmd --zone=zgcw-access --add-port=9939/tcp --permanent
firewall-cmd --zone=zgcw-access --add-port=7001/tcp --permanent
firewall-cmd --zone=zgcw-access --add-port=7002/tcp --permanent
firewall-cmd --zone=zgcw-access --add-port=8091-8094/tcp --permanent
firewall-cmd --reload

work1、work2

1
2
3
firewall-cmd --zone=zgcw-access --add-source=172.17.100.0/24 --permanent
firewall-cmd --zone=zgcw-access --add-port=8091-8094/tcp --permanent
firewall-cmd --reload

ip段

1
2
3
4
5
172.17.100.218
172.17.100.222 work1
172.17.100.223 work2
172.17.100.220 es
172.17.86.0

这里看到

进入TEWA-800E的管理页面,发现只能使用默认用户user登陆,而user没有修改路由模式的权限,现在的问题就是想办法登陆超级用户了,查到超级用户账号密码为CUAdmin/CUAdmin。以前似乎可以使用cu.html来登陆,但我试了下,现在(2018年6月底)应该是已经封掉了。
Chrome打开光猫登陆页面,默认是192.168.1.1,F12进入开发工具,在source中可以看到user_name固定为user,且提交时还加了对用户名的验证。 找到对应的代码,拷贝到console,修改user_name的值为CUAdmin,去掉用户名的验证。

就是在console中执行

1
2
3
4
5
6
7
document.getElementById('user_name').value= 'CUAdmin';
function submitFrm()
{
document.getElementById('loginfrm').submit();
}


就进入管理界面

上行管理中设置第二个连接为桥接方式,保存就可以了。
然后在自己的路由器中设置wlan为ppoe方式,填上用户名密码就行了。

了解一下:
Windows service wrapper
这个软件可以把任何程序作为服务运行,首先下载exe执行文件,我的执行文件命名:customs.exe
创建customs.xml

1
2
3
4
5
6
7
8
<service>
<id>Customs</id>
<name>Customs</name>
<description>This runs Spring Boot Customs as a Service.</description>
<executable>java</executable>
<arguments>-Xmx256m -jar -Dspring.profiles.active=test "c:\jenkins\soft\customs\customs.jar"</arguments>
<logmode>rotate</logmode>
</service>

然后执行安装服务命令

1
2
3
C:\jenkins\soft\customs>customs install
2018-11-30 11:11:23,416 INFO - Installing the service with id 'Customs'

启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
C:\jenkins\soft\customs>customs start
2018-11-30 11:12:42,031 INFO - Starting the service with id 'Customs'

C:\jenkins\soft\customs>dir
驱动器 C 中的卷没有标签。
卷的序列号是 BCFA-AA62

C:\jenkins\soft\customs 的目录

2018/11/30 11:12 <DIR> .
2018/11/30 11:12 <DIR> ..
2018/11/30 11:12 0 customs.err.log
2018/11/30 11:06 360,448 customs.exe
2018/11/30 10:37 39,628,558 customs.jar
2018/11/30 11:12 978 customs.out.log
2018/11/30 11:12 1,612 customs.wrapper.log
2018/11/30 11:09 367 customs.xml

其中customs.out.log 是spring boot 的执行日志,customs.err.log是错误日志
customs.wrapper.log是service wrapper 的执行日志

看到目录名是jenkins开头的,其实这个项目是用jenkins做CI的,在windows节点执行,要求windows节点接入的时候用管理员身份执行,项目用maven打包完成后添加一个windows shell任务
shell脚本如下:

1
2
3
4
5
6
7
8
9
10
rem copy jar to c:\jenkins\customs\customs.jar
copy target\customs-0.0.1-SNAPSHOT.jar c:\jenkins\soft\customs\customs.jar
rem 进入工作目录
cd c:\jenkins\soft\customs

rem 停止服务
customs stop

rem 启动服务
customs start

fabric 国密改造

代码仓库(限制权限的私人仓库)

国密改造补丁:ssh://gitlabs.my118.com:9022/wanghongxing/fabric-sm-patch.git

国密版代码:ssh://git@gitlabs.my118.com:9022/wanghongxing/fabric.git

java sdk 国密版代码仓库 ssh://git@gitlabs.my118.com:9022/blockchain/fabric-sdk-java.git

fabric国密改造包括:源代码改造、sdk改造、ca改造。

Fabric源代码改造的大致清单

主要涉及一下目录及文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
bccsp/factory/gmfactory.go                    
bccsp/factory/nopkcs11.go
bccsp/factory/pkcs11.go
bccsp/gm/fileks.go
bccsp/gm/impl.go
bccsp/gm/keys.go
bccsp/gm/sm2.go
bccsp/gm/sm2key.go
bccsp/gm/sm3sig.go
bccsp/sm2opts.go
bccsp/utils/keys.go
cmd/common/signer/signer.go
common/tools/cryptogen/ca/generator.go
common/tools/cryptogen/ca/generatorsm.go
common/tools/cryptogen/csp/csp.go
common/tools/cryptogen/csp/cspsm.go
common/tools/cryptogen/main.go
common/tools/cryptogen/mainsm.go
common/tools/cryptogen/msp/generator.go
common/tools/cryptogen/msp/generatorsm.go
core/chaincode/shim/ext/attrmgr/attrmgr.go
core/chaincode/shim/ext/cid/cid.go
core/chaincode/shim/ext/cid/interfaces.go
core/common/validation/msgvalidation.go
msp/cert.go
msp/identities.go
msp/mspimpl.go
msp/mspimplsetup.go
msp/mspimplvalidate.go
vendor/github.com/wanghongxing/crypto/sm/sm2/
vendor/github.com/wanghongxing/crypto/sm/sm3/
vendor/github.com/wanghongxing/crypto/sm/sm4/
vendor/github.com/wanghongxing/crypto/x509/

大致功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#bccsp中功过SW方式切换成国密
bccsp/factory/
#基本国密bccsp库
bccsp/gm/
#bccsp中增加sm2的常量
bccsp/sm2opts.go
bccsp/utils/keys.go
#消息验证增加国密
core/common/validation/msgvalidation.go
#msp证书对国密的支持
msp/cert.go
msp/identities.go
msp/
#国密算法,第三方拿过来修改了包名
vendor/github.com/wanghongxing/crypto/sm/
#国密x509证书 ,第三方拿过来修改了包名
vendor/github.com/wanghongxing/crypto/x509/
#discover国密支持
cmd/common/signer/signer.go
#生成证书工具改造
common/tools/cryptogen/
#chaincode中访问证书支持国密
core/chaincode/shim/ext/attrmgr/attrmgr.go
core/chaincode/shim/ext/cid/cid.go
core/chaincode/shim/ext/cid/interfaces.go


fabric国密补丁工程

fabric 官方源代码 fabric1.4.2 下能正常apply入原始项目中,到了fabric1.4.4以后,msp/mspimplvalidate.go 文件不能打入布丁,手动修改后正常.

为了保证以后版本能够正常打入官方发布版本,决定每个版本进行修订,修订包名称定为:

fabric-x.x.x-000xxxx.patch

同时依赖的crypto/sm crypto/x509决定克隆到自己的 git 目录下,确保版本稳定。

1.4.4 补丁

整理后三个patch包如下:

1
2
3
fabric-1.4.4-0001-china-crypto-standards-support-1.4.4.patch
fabric-1.4.4-0002-gm-ecdsa-chaincode.patch
fabric-1.4.4-0003-change-discover-support-gm.patch

分别完成了基本的国密支持、chaincode中证书支持国密、discover中证书支持国密。

使用方法

从fabric官方签出1.4.4的代码

1
git checkout v1.4.4

然后把patch文件复制到fabric父目录下,然后执行

1
2
3
git am ../fabric-sm-patch/fabric-1.4.4-0001-china-crypto-standards-support-1.4.4.patch
git am ../fabric-sm-patch/fabric-1.4.4-0002-gm-ecdsa-chaincode.patch
git am ../fabric-sm-patch/fabric-1.4.4-0003-change-discover-support-gm.patch

1.4.6/1.4.7 版本

整理后有一个patch包

1
fabric-1.4.7-0001-china-crypto-standards-support-1.4.7.patch

使用方法

从官方签出1.4.7代码(注,1.4.7还没有打tag,所以暂时用release-1.4)

1
git chekcout release-1.4

或者(注,1.4.7还没有打tag,所以暂时用v1.4.6)

1
git checkout v1.4.6

然后把patch文件复制到fabric父目录下,然后执行

1
git am ../fabric-sm-patch/fabric-1.4.7-0001-china-crypto-standards-support-1.4.7.patch

fabric国密版本编译

编译环境建立

fabirc的编译需要在ubuntu虚拟机里进行编译,所以先要安装virtualbox和vagrant,安装完以后理论上就可以进入devenv目录目录运行虚拟机。

但是,因为我们伟大的qiang,所以要想编译环境运行好,就先要装fan qiang软件。

我安装了:

小飞机Shadowsocks,这个是作为翻墙用的,但是它只监听127.0.0.1,为了让虚拟机的软件用,我们还要转另外一个东东“privoxy”,让这个东东监听ipv4的端口,我用它监听8118端口,

1
2
3
4
brew install privoxy
#修改配置文件vim /usr/local/etc/privoxy/config
listen-address 0.0.0.0:8118
forward-socks5 / localhost:1080 .

然后修改fabric 的 devenv/Vagrant文件,在这行Vagrant.configure('2') do |config|后面添加着两行:

1
2
# config.proxy.http     = "http://10.0.0.9:8118/"
# config.proxy.https = "http://10.0.0.9:8118/"

注意,#去掉以后起作用,加上就不起作用了,为什么要说加上#不起作用呢?不加不久完了吗?

问题就在这里:

下载github google之类的东东,需要打开;

下载ubuntu系统之类的软件,需要关闭;

就是这么麻烦,如果你的fan qiang线路特别好,就一直打开。否则最简单的就是关闭的时候执行到一半不行了,就打开;打开的时候执行到一半不行了,就关闭。周而复始吧~(fuck)

建好了墙,按理说就可以直接开启虚拟机了,慢~先把Vagrant中

1
2
3
4
5
6
$script = <<SCRIPT
set -x
echo "127.0.0.1 couchdb" | tee -a /etc/hosts
cd #{SRCMOUNT}/fabric/devenv
./setup.sh
SCRIPT

其中./setup.sh这行注释掉,因为在虚拟机启动的时候它就调用,出错了后你都不知道干啥好,出不去进不来的,就像被卡在门缝中一样。

把它注释掉后,进入虚拟机后自己手动执行。

下面启动虚拟机

1
vagrant up

第一次的话需要下载镜像,启动完成后执行进入。

1
vagrant ssh

然后开始慢慢的执行devenv/setup.sh

执行出错后,慢慢手动开关代理,然后粘贴命令执行就行,最后这个东西执行完了之后,编译环境就算创建完了。

编译fabric执行程序

直接执行:

1
make native

这个会把fabric 可执行程序编译好后放在.build/bin/目录下,包括常用的cryptogen configtxgen configtxlator

编译docker镜像

直接执行

1
make docker

这个一般网络不行都会出错,出错以后如果是下载github google之类的错误就打开代理,否则就关闭代理。

如果提示找不到.build/xxx/gotools/目录下的什么文件,这就是在代理切换的过程中,因为脚本文件把创建目录作为执行完的标记,所以没有执行成功下次也不会执行。解决办法就是删除它提示找不到文件的那个目录,大概率就是.build/docker/gotools目录。反正就是github google需要qiang,ubuntu系统文件不能用qiang,因为这些网站dns失败,我也没有细究,手动解决就OK。

打包镜像文件

为了方便大家使用,编译好之后需要把可执行程序和镜像保存起来供大家用,如下命令把所有可执行文件复制到fabric/devenv/bin,然后把镜像保存到:

fabric/devenv/fabric-gm-1.4.7-20200506.tar.gz

1
2
3
4
5
mkdir /vagrant/bin/
cp .build/bin/* /vagrant/bin/

docker save $(docker images | sed '1d' | awk '{print $1 ":" $2 }') | \
gzip -c > /vagrant/fabric-gm-1.4.7-20200506.tar.gz

java sdk国密改造

代码仓库 ssh://git@gitlabs.my118.com:9022/blockchain/fabric-sdk-java.git

改造思路

fabric java sdk使用 bouncycastle 作为加密库,因为bouncycastle 本身已经支持国密的算法,所以只用在fabric java sdk中添加对加密算法、hash算法、证书类型的判断即可。

但是:因为bouncycastle必须手动加载早java security系统中,所以应用程序应该在启动的时候调用如下代码加载Security.addProvider(new BouncyCastleProvider());。否则就会提示类似于不可识别的证书、不支持的算法等莫名其妙的错误提示。

Config改造

java sdk启动的时候在 config.properties 文件查找配置选项,比较有用的几个是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# security level determines the elliptic curve used to generate keys. Valid values are 256 ( curve is P-256 )
# and 384 ( curve is secp384r1 )
org.hyperledger.fabric.sdk.crypto.security_level = 256
# hash algorithm determines the message digest used when creating a signature. Valid values are
# SHA2 ( digest is SHA-256 ) and SHA3 ( digest is SHA-3 )
org.hyperledger.fabric.sdk.crypto.hash_algorithm = SHA2
# The format for the certificate PEM files used by the SDK, Fabric and Fabric-ca components.
# currently X.509 is the only valid format supported. This entry is here to allow for future support
# org.hyperledger.fabric.sdk.crypto.certificate_format = X.509
# The algorithm used to generate a signature. Valid values are listed in the JCA Standard Algorithm Name Documentation
# e.g. http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Signature
org.hyperledger.fabric.sdk.crypto.default_signature_algorithm = SHA256withECDSA


上面的配置是缺省的椭圆曲线配置,为了满足国密支持,我们需要支持如下配置

1
2
3
org.hyperledger.fabric.sdk.crypto.default_signature_algorithm = SM3withSM2
org.hyperledger.fabric.sdk.hash_algorithm = SM3
org.hyperledger.fabric.sdk.security_level=255

security_level=255 是为了避免跟椭圆曲线冲突。

相应的我们需要在Config.java文件中修改加密曲线配置,增加255=sm2p256v1

1
2
3
//defaultProperty(SECURITY_CURVE_MAPPING, "256=secp256r1:384=secp384r1");
defaultProperty(SECURITY_CURVE_MAPPING, "256=secp256r1:384=secp384r1:255=sm2p256v1");

这样系统看到security_level=255 就知道使用 sm2p256v1 加密曲线。

加密套件修改

验证证书

在验证证书的时候CertPathValidator 不能使用缺省的,需要使用bouncycastle 提供的。

1
2
3
4
//CertPathValidator certValidator = CertPathValidator.getInstance(
CertPathValidator.getDefaultType()); // PKIX
CertPathValidator certValidator = CertPathValidator.getInstance(\
CertPathValidator.getDefaultType(), "BC"); // PKIX

配置哈希算法

需要添加sm3的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setHashAlgorithm(String algorithm) throws InvalidArgumentException {

// whx: 添加SM3

if (isNullOrEmpty(algorithm)
|| !("SHA2".equals(algorithm)
|| "SHA3".equals(algorithm)
|| "SM3".equals(algorithm)
)) {
throw new InvalidArgumentException("Illegal Hash function family: "
+ algorithm + " - must be either SHA2 or SHA3 or SM3");
}

hashAlgorithm = algorithm;
}

椭圆曲线证书转换的时候

标准算法转换的时候有这么一句,在国密里面要注释掉,否则验证签名会失败。

1
sigs = preventMalleability(sigs, curveN);

证书工厂配置

修改为之支持x509,由 bouncycastle 提供。

1
2
//            cf = CertificateFactory.getInstance(CERTIFICATE_FORMAT);
cf = CertificateFactory.getInstance("X509", "BC");

增加固定的sha256

因为在提交交易的时候,交易的哈希是固定的sha256,但做签名的时候根据证书使用,所以在这里添加一个sha256,在交易提交的时候调用

1
2
3
4
5
6
7
8
9
//whx 做一个固定的sha256哈希
@Override
public byte[] hashSha256(byte[] input) {
Digest digest = new SHA256Digest();
byte[] retValue = new byte[digest.getDigestSize()];
digest.update(input, 0, input.length);
digest.doFinal(retValue, 0);
return retValue;
}

提交交易的时候:

1
2
3
public TransactionContext(Channel channel, User user, CryptoSuite cryptoPrimitives) {

byte[] txh = cryptoPrimitives.hashSha256(comp.toByteArray());

配置文件

config.properties 作为java sdk的配置文件,缺省在jar执行文件的当前目录,如果没有,就是按照标准的椭圆曲线证书支持;否则,就必须单独做配置文件,如下是标准的国密算法配置内容:

上面的配置是缺省的椭圆曲线配置,为了满足国密支持,我们需要支持如下配置

1
2
3
org.hyperledger.fabric.sdk.crypto.default_signature_algorithm = SM3withSM2
org.hyperledger.fabric.sdk.hash_algorithm = SM3
org.hyperledger.fabric.sdk.security_level=255

国密商密什么意思

国密算法即国家密码局认定的国产密码算法,即商用密码。
国际算法由美国的安全局发布,是现今最通用的商用密码算法。

美国国家标准局

美国国家安全局

商密-国际商用加密算法

一般说商密是指商用密码。更多是我们更加耳熟能详的的密码学标准。诸如AES、DAS、RSA、ECC椭圆曲线系列等加密算法。

国密-中国国家商用密码算法

国密是中国国家密码局认定和颁发的密码算法标准,SM 是一个系列,常用的包括SM1、SM2、SM3、SM4。

经中央机构编制委员会批准,原国家密码管理委员会办公室更名为国家密码管理局

《商用密码管理条例》

《行业标准公告》2012-3-21

为啥有了商密还要有国密

为什么有了商密还要国密。主要原因可能包括:

1、一部分商密的设计中涉及到的一些具体步骤主要是老美的一些强力部门负责的。里面是不是有个什么漏洞啊、后门啊什么的不清楚。

2、国密是自己人弄的,对于原理和实现细节一清二楚。用起来放心。
目前国密主要是对国内的产品,有些特殊的产品国家会强制使用。

密码学目前主要包括有

  • 对称加密算法。常见的包括DES、3DES、AES、SM1等。
  • 非对加密算法。常见的包括RSA、ECC、SM2等。
  • 消息摘要算法。最常见的就是md5、SHA系列、SM3。