KUSONEKOの見る世界

iPhoneで strongSwan (IPsec VPN) に接続する (Machine Certificates)

最近、iPhoneでクライアント証明書認証に再挑戦した所、成功しましたのでメモを残しておきます。
今まで出来なかったのは、コメントアウトをはずし忘れる凡ミスでした…。
というわけで、IKEv2 で使えるクライアント証明書も更新しています。

IKEv2で接続できた各OSの認証方式とクライアント証明書

各OSでIKEv2のVPN接続で使用できた認証方式と証明書と内容をまとめました。


ECDSA証明書でも問題なく証明書認証できるiPhoneは凄い!と感じました。
Windowsでも出来るならやり方を知りたいです。
⇒WindowsでもECPを使用することで可能でした。

IPsec VPN 高セキュリティ&爆速? AES-GCM + ECP に変更した

IPsecをAES-GCMとECPを使うよう変更しました。作成・設定方法を記載しました。セキュリティ面、パフォーマンス面ともに良いとのこと。


環境
iPhone7 (iOS10.3.3)
strongSwan 5.6.2

strongSwan側

以下は、各設定ファイルです。
環境に応じて変更して、ご使用ください。
また、今回はECDSA証明書を使用しています。RSAを使用する場合はご注意ください。

/etc/ipsec.conf

conn ios10-cert
     left=%defaultroute
     leftcert=server.pem
     leftsubnet=192.168.0.0/24
     #leftfirewall=yes
     #lefthostaccess=yes
     leftsendcert=always
     leftid=vpn.example.com
     right=%any
     rightid="username"
     rightsourceip=192.168.255.0/24
     keyexchange=ikev2
     auto=add
     ike=aes256-sha256-modp2048!
     esp=aes256-sha256!

/etc/ipsec.secrets

: ECDSA server-private.key 

iPhone側

iPhoneに設定をインストールするための構成プロファイル(mobileconfig, plist)を作成します。
CertificateTypeという所で、証明書のタイプを指定します。
デフォルトはRSAで、今回はECDSAの証明書なので、ECDSA384を指定しています。
(ここをコメントアウトしていて今までハマってしました…)

プロファイルの最後の方のMIIから始まる部分は、Base64 (PEM)の証明書内容を貼り付けます。
最初の方は、クライアント証明書(pkcs12)です。
後の方は、CA証明書です。

pkcs12ファイルのBase64 (PEM)変換は以下のコマンドで行えます。出力結果を貼り付けてください。
[root@Server ~]# openssl enc -base64 -in clientcert.p12
MII*************************************************************
(省略)
****************************************

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadDisplayName</key>
    <string>Strongswan</string>
    <key>PayloadIdentifier</key>
    <string>com.example.vpn</string>
    <key>PayloadUUID</key>
    <string>9f93912b-5fd2-4455-99fd-13b9a47b4581</string>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>PayloadIdentifier</key>
            <string>com.example.vpn.conf1</string>
            <key>PayloadUUID</key>
            <string>29e4456d-3f03-4f15-b46f-4225d89465b7</string>
            <key>PayloadType</key>
            <string>com.apple.vpn.managed</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>UserDefinedName</key>
            <string>Machine Ceritificate</string>
            <key>VPNType</key>
            <string>IKEv2</string>
            <key>IKEv2</key>
            <dict>
                <key>RemoteAddress</key>
                <string>vpn.example.com</string>
                <key>RemoteIdentifier</key>
                <string>vpn.example.com</string>
                <key>LocalIdentifier</key>
                <string>username</string>
                <key>ServerCertificateIssuerCommonName</key>
                <string>vpn.example.com</string>
                <key>ServerCertificateCommonName</key>
                <string>vpn.example.com</string>
                <key>AuthenticationMethod</key>
                <string>Certificate</string>
                <key>ExtendedAuthEnabled</key>
                <integer>0</integer>
                <key>PayloadCertificateUUID</key>
                <string>d60488c6-328e-4944-9c8d-61db8095c864</string>
                <key>CertificateType</key>
                <string>ECDSA384</string>                
                <key>IKESecurityAssociationParameters</key>
                <dict>
                    <key>EncryptionAlgorithm</key>
                    <string>AES-256</string>
                    <key>IntegrityAlgorithm</key>
                    <string>SHA2-256</string>
                    <key>DiffieHellmanGroup</key>
                    <integer>14</integer>
                </dict>
                <key>ChildSecurityAssociationParameters</key>
                <dict>
                    <key>EncryptionAlgorithm</key>
                    <string>AES-256</string>
                    <key>IntegrityAlgorithm</key>
                    <string>SHA2-256</string>
                    <key>DiffieHellmanGroup</key>
                    <integer>14</integer>
                </dict>
            </dict>
        </dict>
        <dict>
            <key>PayloadIdentifier</key>
            <string>com.example.vpn</string>
            <key>PayloadUUID</key>
            <string>d60488c6-328e-4944-9c8d-61db8095c864</string>
            <key>PayloadType</key>
            <string>com.apple.security.pkcs12</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>PayloadContent</key>
            <data>
            MII*************************************************************
(省略)
****************************************
            </data>
        </dict>
        <dict>
            <key>PayloadIdentifier</key>
            <string>com.example.vpn</string>
            <key>PayloadUUID</key>
            <string>64988b2c-33e0-4adf-a432-6fbcae543408</string>
            <key>PayloadType</key>
            <string>com.apple.security.pem</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>PayloadContent</key>
            <data>
            MII*************************************************************
(省略)
****************************************
            </data>
        </dict>
    </array>
</dict>
</plist>

上記をテキストファイルに貼り付け、strongswan.mobileconfig というファイル名で保存し、 iPhoneにメールなどで転送します。
あとは、iPhoneでプロファイルをインストールします。
途中、パスワードを聞かれますが、pkcs12ファイルのパスワードを入力してください。


iPhoneでEAP-MSCHAPv2接続した時の記事はこちら

iPhoneで strongSwan (IPsec VPN) に接続する (EAP-MSCHAPv2)

iPhoneでstrongSwanにEAP-MSCHAPv2で接続する設定を記載しています。

追記

2018/10/14

iPhone XS iOS12.0.1でも問題なく接続できています。

2018/11/24

macOS MojaveでもこのプロファイルでVPN接続できましたので、
macOSのラベルを追加しておきます。