Enable HTTPS in dockerd
在Ubuntu中安装Docker后,默认会监听本地的socket地址,可以通过/etc/systemd/system/multi-user.target.wants/docker.service
看到启动参数为ExecStart=/usr/bin/dockerd -H fd://
,如果我们想通过远程访问的方式连接到这台主机,使用这台主机的Docker,则需要添加如下参数:
1 |
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert /etc/docker/ssl/ca.pem --tlscert /etc/docker/ssl/cert.pem --tlskey /etc/docker/ssl/key.pem |
其中使用到的证书可以通过如下命令来生成:
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 |
# 创建CA的私钥和公钥 openssl genrsa -aes256 -out ca-key.pem 4096 openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem # 创建服务端的密钥 openssl genrsa -out server-key.pem 4096 # 创建证书签名请求 openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr # 为服务端的公钥签发证书(注意修改IP地址为连接发起方的IP地址) echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extfile.cnf openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out server-cert.pem -extfile extfile.cnf # 创建客户端的密钥 openssl genrsa -out key.pem 4096 # 创建证书签名请求 openssl req -subj '/CN=client' -new -key key.pem -out client.csr # 为客户端的密钥签发证书 echo extendedKeyUsage = clientAuth > extfile-client.cnf openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out cert.pem -extfile extfile-client.cnf # 删除中间文件 # 将{ca,server-key,server-cert}.pem拷贝至/etc/docker/ssl # 将{ca,key,sert}.pem拷贝至客户端的~/.docker目录 |
然后重新加载配置,并重启docker,使用如下命令即可:
1 2 |
sudo systemctl deamon-reload sudo systemctl restart docker |
重启完成后,在将/etc/docker/ssl
内的文件拷贝到需要远程访问的主机内,一般我们使用目录~/.docker
,然后在该主机上配置环境变量:
1 2 3 |
DOCKER_CERT_PATH=$HOME/.docker DOCKER_HOST=tcp://IP:PORT DOCKER_TLS_VERIFY=1 |
然后执行命令docker info
难即可。
PS:Ubuntu每次升级docker都会重置docker.service内的内容,如何持久化上面的修改,还待改进。
PS:上面的证书签发了1年的时候,过期后重新执行签发证书操作即可。
Build PHP 7.1/7.2 in Linux
开发环境和生产环境使用的Linux发行版,都没有官方的PHP7.0以上的安装包,只能通过自己手动编译的方式,打包后上传到镜像内。
分享一下我使用的编译参数:
PHP 7.1
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 |
./configure \ --prefix=/home/***/php7.1 \ --with-config-file-path=/home/***/php7.1/etc \ --enable-fpm \ --with-mcrypt \ --with-gd \ --enable-gd-native-ttf \ --with-jpeg-dir \ --with-freetype-dir \ --with-png-dir \ --with-libxml-dir \ --enable-xml \ --enable-mbregex \ --with-mcrypt=/usr/local/bin \ --with-mysqli \ --enable-soap \ --enable-mbstring \ --enable-pdo \ --with-pdo-mysql \ --with-curl=/usr/local/curl \ --with-mhash \ --enable-opcache \ --enable-bcmath \ --with-openssl \ --with-zlib \ --enable-pcntl \ --enable-sockets \ --with-ldap \ --with-ldap-sasl \ --enable-zip |
PHP 7.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 |
./configure \ --prefix=/home/***/php7.2 \ --with-config-file-path=/home/***/php7.2/etc \ --enable-fpm \ --with-gd \ --with-jpeg-dir \ --with-freetype-dir \ --with-png-dir \ --with-libxml-dir \ --enable-xml \ --enable-mbregex \ --with-mysqli \ --enable-soap \ --enable-mbstring \ --enable-pdo \ --with-pdo-mysql \ --with-curl=/usr/local/curl \ --with-mhash \ --enable-opcache \ --enable-bcmath \ --with-openssl \ --with-zlib \ --enable-pcntl \ --enable-sockets \ --with-ldap \ --with-ldap-sasl \ --enable-zip |
执行完成后,执行 make && make intall
即可
–EOF–
PHP-PM without Docker
按照PHP-PM网站上介绍的方法,在不使用Docker的情况下,按照WIKI给的方法,是很难把一个Laravel应用跑起来的。
由于出错信息看上去也没有什么营养,在网上Google了好久也没有找到解决的办法。不过后来大概还是找到了方法:
1、按照上面WIKI里的方法做到最后;
2、在PHP-PM安装目录内执行:composer require php-pm/httpkernel-adapter
3、在Laravel项目内执行:ppm start
分享一份可以运行的Laravel的ppm.json配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "bridge": "HttpKernel", "host": "0.0.0.0", "port": 8080, "workers": 16, "app-env": "dev", "debug": 0, "logging": 1, "static-directory": "public\/", "bootstrap": "laravel", "max-requests": 1000, "ttl": 0, "populate-server-var": true, "socket-path": ".ppm\/run\/", "pidfile": ".ppm\/ppm.pid", "reload-timeout": 30, "cgi-path": "\/home\/***\/php7.2\/bin\/php-cgi" } |
关键就在于上面的第三步,除了Laravel,其他类型的项目(Symphony)应该安装相应的Bridge都可以解决吧。
不得不说,Docker已经强大到有些项目不照顾不用Docker的人的感受了。
–EOF–
文件加密传输
我的需求是这样的,我需要将一份文件通过Email的方式安全地拷贝给外部人员,这份文件在传输的过程中有可能会存在失窃的可能性,所以要求进行加密后传输。
很自然的想到了非对称加密的办法,让接收方生成一份私钥和公钥,把公钥发给发,我用公钥将文件加密后发送给接收方。这样即使在中间过程中文件失窃,由于无法解密,也看不到文件的内容。
But,事实是这样的
SA operation error
89450:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-64.50.6/src/crypto/rsa/rsa_pk1.c:153:
openssl提供的工具使用非对称加密无法对过大的文件进行处理(实验得知其实能处理的文件大小很小)
这个方法不行,于是简单的回忆了一下HTTPS工作的过程,于是有了以下的办法:
接收方:
生成私钥
openssl genrsa -out private_key.key 1024
提取公钥
openssl rsa -in private_key.key -pubout -out public_key.pub
接收方将公钥发送给发送方
发送方:
生成base64编码的64位密码文件
openssl rand -base64 64 > passwd.txt
用公钥加密密码文件
openssl rsautl -encrypt -in ./passwd.txt -inkey ./public_key.pub -pubin -out ./passwd-encrypted.txt
用密码文件加密文件
openssl enc -aes-256-cbc -in ./file.txt -out ./file-encrypted.txt -e -kfile ./passwd.txt
将passwd-encrypted.txt和file-encrypted.txt发送给接收方
接收方:
用私钥解密密码文件
openssl rsautl -decrypt -inkey ./private_key.key -in ./passwd-encrypted.txt > passwd-decrypted.txt
用密码文件解密文件
openssl enc -aes-256-cbc -in ./file-encrypted.txt -d -kfile ./passwd.txt -out file.txt
这个过程与HTTPS的过程非常类似(除去无证书验证身份外)
~/.ssh/config的一些推荐配置
最近看了一些资料,感觉之前用了这么多年的 ssh 浪费了好多大好的青春和时间。这里给一个我现在在使用 ~/.ssh/config
的范本,可以为使用 ssh 登录时带来非常多的方便之处。
1.多个 SSH 之间共享同一个连接,在第一次连接成功后,再次连接同一个主机,不用输入密码。
Host *
ControlMaster auto
ControlPath ~/.ssh/ssh_mux_%r@%h:%p
ControlPersist 10m
2.连接特定的主机时,自动添加主机名的 domain
Host ss*
HostName %h.domain-name.com
3.为某个主机设置别名,同时指定使用的端口、用户名和密钥
Host xxx-yyy
HostName xxx-yyy.domain-name.com
Port 29939
User username-root
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
4.使用代理连接某个主机
Host ln-tky2
ProxyCommand /usr/bin/nc -X 5 -x localhost:1080 %h %p
HostName xxx-yyy.domain-name.com
5.保持连接可用,在没有交互的时候发送心跳给主机
Host qcloud
HostName x.y.z.a
User ubuntu
PreferredAuthentications publickey
IdentityFile ~/.ssh/qcloud
# keep live in 1 hour
ServerAliveCountMax 60
# send a heart beat to server every 60 seconds
ServerAliveInterval 60
具体的信息可以 man ssh_config
查看。
最近变化有点大
一晃2017年已经快要过去1/12了,回想起2016年,发生了非常多的事情,卖房买房装修换工作,儿子也在不知不觉中快到了上幼儿园的年纪。
在百度呆了5年多,学习到了非常多的东西,无论是在技术上还是非技术上都给我的成长提供了很好的帮助。以前从来没有想过要从百度出来,不过没有看过外面的世界总是心有不甘。从毕业入职,经历了北京上海两地,5年多的时间,其实基本上就是在做一件事情。能够围绕一套系统做五年多,并且还在持续改进,我想这在大多数公司里都是非常难得的机会。希望Mola日后能发展的更好,后面如果能开源出来,我还是可以继续贡献代码的。哈哈……
整个换工作的过程,被各种琐事烦得不行,公积金、居住证积分、个税合并申报,没有任何一件事情是顺顺利利办下来的,相信是好事多磨的原因吧,好在最后都办好了。换到滴滴以后,遇到了更多的挑战,技术上的,业务上的,团队管理上的,我是个愿意接受挑战的人,也希望能够跳出自己原来的舒适的环境,做出一些不太一样的事情来。
2017年春节就要来了,值此新年之际,我谨代表我和我老婆儿子,恭祝各位鸡年大吉吧!
哦,又长了一岁
mktime之夏令时
最近遇到了一件奇怪的事情,单元测试里写的一段代码在本地跑没有问题,放到Jenkins上跑就出问题。因为是跟时间相关的,所以一开始怀疑与时区有关系,跑到测试机上去看,时区配置的没有问题。代码逻辑很简单,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> #include <time.h> int main(int argc, char** argv) { struct tm tm; char buf[255]; strptime("2000-03-21 00:00:00", "%Y-%m-%d %H:%M:%S", &tm); time_t timestamp = mktime(&tm); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &tm); puts(buf); return 0; } |
最后打印的时间与最初传入的时间可能并不一致。
追踪了半天,最后发现是tm.tm_isdst影响了结果的正确性。tm_isdst是用来描述是否是daylight saving time的属性,而strptime由于并不能确认是否是冬令时/夏令时,所以并没有置这个值,而是保留了其原有的默认值。而原有的默认值由于没有初始化,其值会影响mktime的行为,mktime会根据tm_isdst来修正tm中的各项值。
所以,在使用struct tm前,将其初始化成全0是最安全的。
圣诞快乐!
我似乎已经很久没有写日志了,久得上一篇工作总结还是写的入职两年。
原来一直在使用GoDaddy的空间,去年到期的时候,就想着要换到别的空间去,顺带着供我范强用,但是拖啊拖啊,不停地每个月续租到现在。最近一段时间,试了搬瓦工,速度不错,似乎装上Nginx,MySQL和PHP也跑得挺顺畅。
于是今天终于下定决心,搞到这里来了。
近期评论