本文需要基础 Linux 知识与网络知识。
请自行替换文内的所有全大写字段。
简要原理
以下包含口胡,欢迎指正。
TLS/SSL 证书认证
TLS/SSL 协议的允许连接双方都对端做身份认证。
对服务器端认证一般采用证书认证的,对客户端认证一般采用用户名+密码的认证。
由于每次都输入密码较为繁琐,因此对客户端亦采用证书认证的方式能更方便。
Let’s Encrypt 签发流程 (WebRoot)
- 客户端生成验证文件,存放到
WEBROOT/.well-known/acme-challenge/
- 客户端告知 Let’s Encrypt 服务器开始验证
- 服务器读取
http://DOMAIN/.well-known/acme-challenge/
进行验证
- 客户端向服务器查询验证是否成功
- 若验证成功,向服务器获取证书
其中 1、3 为可能出现问题的地方,若获取证书失败,建议优先检查此部分。
如:WEBROOT 不可被 letsencrypt 客户端写入;Let’s Encrypt 服务器无法解析 DOMAIN 的 DNS;DOMAIN 对应的 IP 非 Let’s Encrypt 客户端写入验证文件的主机等诸多问题。
服务器证书
自建 CA 并签发服务器证书固然是可行方案,但需要在每台设备上都信任该自建 CA,较为麻烦且不安全。
因此我采用 Let’s Encrypt 来获取合法的服务器证书。
以下大部分命令需要 root 权限,但可以通过配置目录的读写权限绕过。
建议同时阅读 Let’s Encrypt User Guide。
事前准备
- 将域名 DOMAIN 的 A/AAAA 记录指向当前主机。
- 配置 HTTP 服务器,使
WEBROOT/.well-known/acme-challenge/
可被访问。
获取证书
测试时建议加上 --test-cert
以免用完 Let’s Encrypt 的证书获取速率限制。
自动更新证书
添加 cron 脚本至 /etc/cron.monthly/certbot
,实现每月自动更新。
用户证书
用户证书只需 ocserv 信任 CA 即可,因此使用自建 CA 签发证书。
将以下脚本保存到 /etc/ocserv/certs/
,然后运行 ./ocm generate USERNAME
即可直接生成用户证书 USERNAME.p12
。
ocserv
编译安装 ocserv
注意安装依赖,阅读 README.md
即可。
配置 ocserv
复制配置文件:cp /opt/ocserv-${VERSION}/doc/sample.config /etc/ocserv/ocserv.conf
修改以下项:
配置服务器
修改 /etc/sysctl.conf
中的 net.ipv4.ip_forward=1
,然后刷新配置 sysctl -p /etc/sysctl.conf
。
修改 iptables,注意对 iptables 做持久化。
测试 ocserv
修改 ocserv.conf
中的 auth = "plain[passwd=/etc/ocserv/passwd]"
。
创建用户 ocpasswd -c /etc/ocserv/passwd your-username
。
运行 ocserv ocserv -f -d 1
,在手机上尝试连接。
配置证书认证
修改 /etc/ocserv/ocserv.conf
中的以下项:
重新运行、测试连接。
附录
以 service 运行 ocserv (Ubuntu)
执行以下指令
启动服务:service ocserv start
停止服务:service ocserv stop
方便的安装用户证书(iOS)
- 将生成的用户证书
USER.p12
复制到 WEBROOT
。
- 打开 AnyConnect 客户端,切换到 Diagnostics 页。
- 点击 Certificates 项,点击 Import User Certiticate…
- 输入
http://DOMAIN/USER.p12
,然后输入密码。
参考资料
历史记录
20160215:Init
20161018:使用 certbot(CentOS)