HTTPS当前越来越重要,所以经常会有公司去花钱买,我们也一样,有时候确实需要https,但是收费的用不起,所以打起了免费的主义。
LetsEncrypt是不错的选择,但是我们如果在内网该如何克服呢,没错,使用ngrok。
一键生成。
ngrok是在内网用户可以获得公网访问的一个非常棒的软件。
找一台有公网地址的机器
我们找到了假设是公网A
找一个域名,用于传输流量
我们找到了,假设是ops.ac.cn,注意,ac.cn是域名哦,虽然是二级域名,但是ac.cn是中科院相关的域名机构。
而且我们要设置 泛域名 A记录到 公网A
搭建ngrok
如下脚本一气呵成, 胆儿大的可以直接试试。最终的目录是在/usr/local/ngrok下面
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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# 安装基本依赖 yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ asciidoc yum remove -y git wget https://www.kernel.org/pub/software/scm/git/git-2.6.0.tar.gz tar zxvf git-2.6.0.tar.gz cd git-2.6.0 make configure ./configure --prefix=/usr/local/git --with-iconv=/usr/local/libiconv make all doc make install install-doc install-html echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc source /etc/bashrc ln -s /usr/local/git/bin/* /usr/bin/ # 安装go环境 yum install -y mercurial bzr subversion wget https://storage.googleapis.com/golang/go1.4.1.linux-amd64.tar.gz tar -C /usr/local -xzf go1.4.1.linux-amd64.tar.gz mkdir $HOME/go echo 'export GOROOT=/usr/local/go' >> ~/.bashrc echo 'export GOPATH=$HOME/go' >> ~/.bashrc echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' >> ~/.bashrc source $HOME/.bashrc ln -s /usr/local/go/bin/* /usr/bin/ # 编译ngrok cd /usr/local/ git clone https://github.com/inconshreveable/ngrok.git export GOPATH=/usr/local/ngrok/ export NGROK_DOMAIN="ops.ac.cn" cd ngrok # 为域名生成证书 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem openssl genrsa -out server.key 2048 openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000 cp rootCA.pem assets/client/tls/ngrokroot.crt cp server.crt assets/server/tls/snakeoil.crt cp server.key assets/server/tls/snakeoil.key sed '5 ilog "github.com/keepeye/log4go"' -i /usr/local/ngrok/src/ngrok/log/logger.go # 编译服务端 cd /usr/local/go/src GOOS=linux GOARCH=amd64 ./make.bash cd /usr/local/ngrok/ GOOS=linux GOARCH=amd64 make release-server GOOS=linux GOARCH=amd64 make release-client # 编译客户端 cd /usr/local/go/src GOOS=darwin GOARCH=amd64 ./make.bash cd /usr/local/ngrok/ GOOS=darwin GOARCH=amd64 make release-client cd /usr/local/go/src GOOS=windows GOARCH=amd64 ./make.bash cd /usr/local/ngrok/ GOOS=windows GOARCH=amd64 make release-client |
ngrok服务启动
1 2 3 4 |
#!/bin/bash cd /usr/local/ngrok/ ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="ops.ac.cn" |
客户端连接
1 2 3 |
# 配置文件准备 server_addr: "ops.ac.cn:4443" trust_host_root_certs: false |
ngrok出现”bad certificate”的原因:
1. 看准了, server_address居然是直接使用的主域名,
2. 编译出来的ngrok程序一定是使用和server相同的证书产生的。如果server编译出来的在本地运行的时候出现“segment fault“,那么可以尝试着将/usr/local/ngrok放到本地,然后运行编译客户端的几行代码重新编译即可。
3. 客户端启动的配置文件中,trust_host_root_certs选项,除非你的证书是第三方的,否则就乖乖的使用false吧
ssl脚本执行目录:/root/ssl/
www目录: /root/www/challenges , python -m SimpleHTTPServer 80
sendemail放置地方:/root/ssl/sendemail
HTTP服务器准备
如果胆儿大,直接执行如下的内容即可
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 |
#!/bin/bash # filepath: /root/ssl/a.sh # 清场 ls | grep -v a.sh | grep -v sendemail | grep -v tar.gz | xargs -i rm -f {} which openssl || (echo "没有找到openssl,开始安装"; yum install -y openssl) # 创建一个目录 mkdir /root/ssl && echo "创建临时目录成功!" || (echo "创建临时目录失败";exit) # 创建一个RSA私钥 openssl genrsa 4096 > account.key && echo "创建RSA私钥成功!" || (echo "创建RSA私钥失败!";exit) # 创建另一个RSA私钥 openssl genrsa 4096 > domain.key && echo "创建另外一个私钥成功!" || (echo "创建另外一个RSA私钥失败!";exit) #创建ECC私钥 openssl ecparam -genkey -name secp256r1 | openssl ec -out domain.key && echo "创建ECC私钥成功!" || (echo "创建ECC私钥失败!";exit) openssl ecparam -genkey -name secp384r1 | openssl ec -out domain.key && echo "创建ECC私钥成功!" || (echo "创建ECC私钥失败!";exit) #生成CSR文件,有两种方式,我用的是第二种,但是第一种可以一次多申请几个,可以稍后测试 # In how many days should certificates expire? export KEY_EXPIRE=3650 export KEY_COUNTRY="CN" export KEY_PROVINCE="SD" export KEY_CITY="JN" export KEY_ORG="IIOT" export KEY_EMAIL="zzlyzq@gmail.com" export KEY_OU="CloudPlatform" #openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr openssl req -new -sha256 -key domain.key -out domain.csr # 配置验证服务,为啥要这么说呢,因为letsencrypt给的也是DV,也就是域名验证,我们运行软件申请的时候,本身python脚本会在本地写一个随机数到一个随机文件,它们官方会从远端经过公网DNS解析并去获取这个文件,如果一致,就说明这个站点是我们的,也就可以申请证书了。 [ -d "~/www/challenges" ] || mkdir -p ~/www/challenges/ # 另外,还需要两个步骤,最后会说明为啥要这两个步骤。 mkdir /root/www/challenges/.well-known/ -p ln -s /root/www/challenges/ /root/www/challenges/.well-known/acme-challenge # 接下来我们就要下载python脚本,并去申请证书了 wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py # 在执行下面之前,我们可以打开网站,最简单的就是使用python #nohup python -m SimpleHTTPServer 80& python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/www/challenges/ > ./signed.crt # 如果一切正常,我们会看到signed.crt这个就是我们的证书了。 # 另外,我们还需要letsencrypt的中间证书,我也不知道啥意思,反正是需要一个官网的东西 wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.pem wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem cat intermediate.pem root.pem > full_chained.pem # 打包发送 tar czvf crt.tar.gz chained.pem domain.key ./sendemail -f 123@vip.126.com -t 123@iiot.ac.cn -s smtp.vip.126.com -u "证书快递" -xu 123 -xp 123 -m "证书For域名:XX生成成功" -a crt.tar.gz -o message-charset=utf-8 |
生成的时候会要求输入一些东西,比如国家,省会,城市,公司名称,common name最重要,这个就是域名哦。
生成完成后,会自动打包发送邮件。
转自: https://blog.csdn.net/vbaspdelphi/article/details/53185943
可参考:https://learnku.com/articles/19999
0 Comments