iOS版のOpenVPNでもOpenVPNの設定ファイルと秘密鍵などをインポートすると使うことができますが、設定ファイルと秘密鍵など複数のファイルに分かれているとなかなか扱いが面倒だと思います。(iTunesのファイル共有を使ってファイルを転送する必要があるかもしれません。)
OpenVPNの設定ファイルには鍵情報を含めることができますが、PCとiOSによって形式が違うため気をつけないとハマってしまいます。(私のことです…)
備忘録も兼ねて残しておこうと思います。
設定のファイル内に鍵情報が混在することになるため扱いにはご注意ください。
TL;DR
#通常通り設定する
client
dev tun
#...
#鍵ファイルの指定はコメントアウトするか消す
#ca ca.crt
#cert client.crt
#key client.key
#tls-auth ta.key 1
#tls-auth使っている場合は下記を追記
key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
CAの証明書
-----END CERTIFICATE-----
</ca>
<key>
-----BEGIN RSA PRIVATE KEY-----
クライアントの秘密鍵
-----END RSA PRIVATE KEY-----
</key>
<cert>
-----BEGIN CERTIFICATE-----
クライアントの証明書
-----END CERTIFICATE-----
</cert>
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
TLSAuth用の鍵
-----END OpenVPN Static key V1-----
</tls-auth>
設定にファイルを組み込む
ファイルの指定を削除する
通常ca ca.crt
やkey client.key
などと鍵や証明書のファイルを指定しますがその箇所を削除します。
ただしtls-auth ta.key 1
と指定している場合はkey-direction 1
に置き換えてください。
設定ファイルにファイルを追記する
ファイルの指定を削除した代わりに各ファイルを組み込む必要があります。
XMLのようにタグを使い中にファイルの内容を記載します。
ca ca.crt
なら<ca>~</ca>
、
tls-auth ta.key 1
なら<tls-auth>~</tls-auth>
のようなタグを使います。
生成スクリプト
事前に組み込み前の設定ファイルと鍵ファイル等を用意しているのであれば下記のスクリプトで変換することができます。
#! /bin/sh
if [ ! "$#" = "1" ];then
echo Usage: $0 openvpn.conf
fi
# Original config file
confname=$1
# CA cert file
caname=`grep -e "^ca" ${confname} |sed 's/.* //g'`
# Client cert file
certname=`grep -e "^cert" ${confname} |sed 's/.* //g'`
# Key file
keyname=`grep -e "^key" ${confname} |sed 's/.* //g'`
# TLS-Auth key file
tlsauthname=`grep -e "^tls-auth" ${confname} |sed 's/tls-auth \(.*\) 1/\1/g'`
# New config file
ovpnname="${confname%%.*}.ovpn"
if [ -f "${ovpnname}" ]; then
printf "Overwrite(${ovpnname})?:"
read ans
if [ ! "${ans}" = "Y" -a ! "${ans}" = "y" ]; then
exit
fi
fi
# Load original config file
cat ${confname} |grep -v -e "^ca" -e "^cert" -e "^key" | sed 's/^tls-auth .*$/key-direction 1/g' > ${ovpnname}
# Append CA cert
if [ ! "${caname}" = "" -a -f ${caname} ]; then
echo "<ca>" >> ${ovpnname}
cat ${caname} >> ${ovpnname}
echo "</ca>" >> ${ovpnname}
fi
# Append client private key
if [ ! "${keyname}" = "" -a -f ${keyname} ]; then
echo "<key>" >> ${ovpnname}
cat ${keyname} >> ${ovpnname}
echo "</key>" >> ${ovpnname}
fi
# Append client cert
if [ ! "${certname}" = "" -a -f ${certname} ]; then
echo "<cert>" >> ${ovpnname}
cat ${certname} >> ${ovpnname}
echo "</cert>" >> ${ovpnname}
fi
# Append TLS Auth key
if [ ! "${tlsauthname}" = "" -a -f ${tlsauthname} ]; then
echo "<tls-auth>" >> ${ovpnname}
cat ${tlsauthname} >> ${ovpnname}
echo "</tls-auth>" >> ${ovpnname}
fi
あとがき
iOSでOpenVPNを設定する際に苦戦したため記事に残しておきました。
この記事で沼から抜け出せる人がいることを願っています…
もし間違いなどがあればご指摘いただければ幸いです。
Reference