LoginSignup
5
4

More than 3 years have passed since last update.

iOS用OpenVPNの設定ファイルの作り方

Posted at

iOS版のOpenVPNでもOpenVPNの設定ファイルと秘密鍵などをインポートすると使うことができますが、設定ファイルと秘密鍵など複数のファイルに分かれているとなかなか扱いが面倒だと思います。(iTunesのファイル共有を使ってファイルを転送する必要があるかもしれません。)
OpenVPNの設定ファイルには鍵情報を含めることができますが、PCとiOSによって形式が違うため気をつけないとハマってしまいます。(私のことです…)
備忘録も兼ねて残しておこうと思います。

設定のファイル内に鍵情報が混在することになるため扱いにはご注意ください。

TL;DR

OpenVPN.ovpn
#通常通り設定する
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.crtkey 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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4