Teams 开发需要使用内网映射工具,官方推荐ngrok,恰好之前用过ngrok,就直接拿原来的使用了,但是需要Https格式的。
Ngrok安装参见【Ngrok安装】,https配置如下:
首先安装openssl。
在Linux服务器上新建文件夹,然后执行命令
openssl genrsa -des3 -out server.key 1024
提示输入密码。
然后执行
openssl req -new -key server.key -out server.csr
先属于上一步的密码,然后开始配置:
Country Name (2 letter code) [XX]:cn #国家
State or Province Name (full name) []:shanxi #省份
Locality Name (eg, city) [Default City]:taiyuan #城市
Organization Name (eg, company) [Default Company Ltd]:BBA #公司
Organizational Unit Name (eg, section) []:BBF #部门
Common Name (eg, your name or your server's hostname) []:*.ngrok.ithinkcry.cn #主机名称
Email Address []:[email protected] #邮箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:XXX #证书请求密钥,CA读取证书的时候需要输入密码
An optional company name []:BBA #公司名称,CA读取证书的时候需要输入密码
结束之后,再次执行:
openssl rsa -in server.key -out server_nopassword.key #对key进行解密
openssl x509 -req -days 365 -in server.csr -signkey server_nopassword.key -out server.crt #标记证书使用上述私钥(ryz123)和CSR
然后可以看到生成了若干文件
[zzj@jiba self]$ ll
total 16
-rw-rw-r-- 1 zzj zzj 928 Jul 13 15:34 server.crt
-rw-rw-r-- 1 zzj zzj 753 Jul 13 15:34 server.csr
-rw-rw-r-- 1 zzj zzj 963 Jul 13 15:33 server.key
-rw-rw-r-- 1 zzj zzj 891 Jul 13 15:34 server_nopassword.key
此处需要用到server.crt 和 server_nopassword.key
在nginx中配置的时候需要注意:因为ngrok服务端启动的时候命令如下:
/home/zzj/ngrokcode/ngrok/bin/ngrokd -tlsKey=/home/zzj/ngrokcode/ngrok/assets/server/tls/snakeoil.key -tlsCrt=/home/zzj/ngrokcode/ngrok/assets/server/tls/snakeoil.crt -domain="ngrok.ithinkcry.cn" -httpAddr=":18015" -httpsAddr=":18014" -tunnelAddr=":4443" > /home/zzj/ngrokcode/ngrok/bin/ngrok.log &
请注意里面的 参数 -httpAddr=":18015" -httpsAddr=":18014"
18015是http的,18014是https的,但是其实在nginx中配置的时候,全部选择18015.
Nginx配置如下:
http配置:
server {
listen 80;
server_name *.ngrok.ithinkcry.cn;
location / {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 6 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
}
location ~ .*\.(gif|jpg|png|bmp|swf)$ {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
expires 30d;
}
location ~ .*\.(js|css)?$ {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
expires 1d;
}
}
https配置: 其中的端口都是18015,而不是18014.
server {
listen 443 ssl;
server_name *.ngrok.ithinkcry.cn;
ssl on;
ssl_certificate /home/zzj/certs/self/server.crt;
ssl_certificate_key /home/zzj/certs/self/server_nopassword.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:1m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 6 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
}
location ~ .*\.(gif|jpg|png|bmp|swf|ico)$ {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
expires 30d;
}
location ~ .*\.(js|css)?$ {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
expires 1d;
}
}
配置完毕后,启动ngrok服务端和客户端。访问浏览器地址,虽然证书显示不可靠,但是可以成功访问https。
配置完毕
经过配置发现,如果是失效/不可靠的证书,Windows Teams是无法通过你的Ngrok的URL传送请求的。
因此,我在阿里云申请了一个证书: teams.ngrok.ithinkcry.cn.
直接把阿里云上生成的nginx证书文件 key和pem下载下来,配置到nginx.confg中去。
server {
listen 443 ssl;
server_name *.ngrok.ithinkcry.cn;
ssl on;
# ssl_certificate /home/zzj/certs/self/server.crt;
# ssl_certificate_key /home/zzj/certs/self/server_nopassword.key;
ssl_certificate /home/zzj/certs/nginx/teams.ngrok.ithinkcry.cn.pem;
ssl_certificate_key /home/zzj/certs/nginx/teams.ngrok.ithinkcry.cn.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:1m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 6 128k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
}
location ~ .*\.(gif|jpg|png|bmp|swf|ico)$ {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
expires 30d;
}
location ~ .*\.(js|css)?$ {
proxy_pass http://172.26.88.76:18015;
proxy_set_header Host $host:18015;
expires 1d;
}
}
这就表明,只能使用有效的https证书。此处我在ngrok客户端使用的域名前缀是 teams,就是说完整的url是teams.ngrok.ithinkcry.cn. 因此在申请阿里云证书的时候需要申请对应的teams.ngrok.ithinkcry.cn证书。