生成证书(可选)
注意 如果不生成证书,后面配置部分的配置中用 pubkey 认证的 conn 都不能用,甚至不能保留在配置中。
每一个完整的 ssl 证书都有一个公钥和一个私钥,它们可以在一起也可以分开放(当然如果你要在网络上传输,肯定只能用公钥)。公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)。
生成 CA 证书
生成一个私钥:
ipsec pki –gen –outform pem > ca.pem
没什么好解释的,–outform 一共有三个格式可选,但是另外两个是 der 和 pgp…
基于这个私钥自己签一个 CA 证书:
ipsec pki –self –in ca.pem –dn “C=CN, O=strongSwan, CN=strongSwan CA” –ca –outform pem > ca.cert.pem
这里 –self 表示自签证书,–in 是输入的私钥,–dn 是判别名,–ca 表示生成 CA,其它同上。这里需要解释下判别名:
C 表示国家名,同样还有 ST 州/省名,L 地区名,STREET(全大写) 街道名。
O 表示组织名。
CN 为通用名。
具体见微软的文档:Distinguished Names
生成服务器证书
同样生成私钥:
ipsec pki –gen –outform pem > server.pem
用我们刚才自签的 CA 证书给自己发一个服务器证书:
ipsec pki –pub –in server.pem | ipsec pki –issue –cacert ca.cert.pem
–cakey ca.pem –dn “C=CN, O=strongSwan, CN=forum.suse.org.cn”
–san=”forum.suse.org.cn” –flag serverAuth –flag ikeIntermediate
–outform pem > server.cert.pem
这条命令的意思解释下:
ipsec pki –pub –in server.pem
是从我们刚生成的私钥里把公钥提取出来,然后用公钥去参与后面的服务器证书签发(这个是 VPN 连接时候要用的,你不想把私钥也给它吧?那样跟没签证书一样…)。
–issue, –cacert 和 –cakey 就是表明要用刚才自签的 CA 证书来签这个服务器证书。
–dn, –san,–flag 是一些客户端方面的特殊要求:
iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;
Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),–flag serverAuth;
非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU),–flag ikdeIntermediate;
Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,–san。
生成客户端证书
依然是生成私钥:
ipsec pki –gen –outform pem > client.pem
然后用刚才自签的 CA 证书来签客户端证书:
ipsec pki –pub –in client.pem | ipsec pki –issue –cacert caCert.pem
–cakey caKey.pem –dn “C=CN, O=strongSwan, CN=client”
–outform pem > client.cert.pem
这时命令行会提示你输入两遍密码,这个就是你的客户端证书密码。
看懂了服务器的,客户端的也就不难理解了。除了没有那一堆特殊要求别的都一样。
客户端证书可以每个客户端签一个,也可以让它们公用一个。是否多签看用途,一般用于区分设备(计费是不用这样的,是用账户来区分的)。
生成 pkcs12 证书(可选)
你可能还想生成一个可以直接导入的 pkcs12 证书(用于手机,诺基亚没这东西还不行):
openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name “client”
-certfile ca.cert.pem -caname “strongSwan CA” -out client.cert.p12
原文地址:https://zh.opensuse.org/SDB:Setup_Ipsec_VPN_with_Strongswan