Easy-RSAによるOpenVPNの設定

注釈

このガイドは進行中のものであり、随時更新されます。この点をご理解の上、ご利用ください。

このガイドでは、`Nitrokey Pro 2 <https://shop.nitrokey.com/shop/product/nk-pro-2-nitrokey-pro-2-3>`_または`Nitrokey Storage 2 <https://shop.nitrokey.com/de_DE/shop/product/nitrokey-storage-2-56>`_を使用してログインするようにOpenVPNクライアントを設定する方法を説明します。ソフトウェアの鍵管理には、OpenVPNとともに進化してきたユーティリティーである`Easy-RSA <https://github.com/OpenVPN/easy-rsa>`_を使用します。

To sign the certificates, we will use a Nitrokey HSM 2 set up as Certificate Authority, however this guide does not cover the set up of the CA itself (it is clear and well documented here).

ここでは、柔軟性があり、外部PKIによる鍵管理が可能なEasy-RSAを使用します。これをサーバで使用して署名要求を発行し、クライアントでも同じプロセスを繰り返します。証明書署名要求は、Nitorkey HSMのCAによって署名され、サーバとクライアントに再送信されます。

前提条件

以下の資料では、以下の3台のマシンを必要とします。

  • Debian 10上のOpenVPNサーバ(v.2.5)(EC2仮想マシン-AWS)

  • Fedora 30のOpenVPNクライアント(v.2.4.9)(ローカルマシン)

  • 認証局は、Fedora 30 を搭載したスタンドアロンのマシン(ローカルマシン)からアクセスします。

デバイスと対話するためには、`OpenSC 0.20 <https://github.com/OpenSC/OpenSC/wiki>`_をクライアントとCAマシン(ローカルマシン)にインストールする必要があります。`このリンク(*Unix)<https://github.com/OpenSC/OpenSC/wiki/Compiling-and-Installing-on-Unix-flavors>`_の指示に従ってセットアップすることができます。

Fedoraのマシンで依存ファイルをダウンロードするには、次の手順を実行します。

su -c 'dnf install readline-devel openssl-devel libxslt docbook-style-xsl pcsc-lite-devel automake autoconf libtool gcc zlib-devel'

Debian Linuxでは、より新しいOpenSCのパッケージが`こちら<https://github.com/Nitrokey/opensc-build>`_に用意されています。

物理的な鍵の管理には、以下のNitrokeysを使用します。

なお、Nitrokey HSM 2で認証局を構築するには、ドキュメント`の<certificate-authority.html#sign-a-server-certificate>`_に記載されている手順に従うことができます。

あるいは、`別のマシン上で独自のCAをセットアップするか、<https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-a-certificate-authority-ca-on-ubuntu-20-04>`_に依存するOpenVPNチュートリアルを使用するか、`Easy-RSA <https://openvpn.net/community-resources/setting-up-your-own-certificate-authority-ca/>`_に依存することもできます。最後の2つのオプションは、鍵管理のためのソフトウェアソリューションに依存しています。


サーバー側

1.OpenVPNのインストール

  1. まず、``/etc/sysctl.conf``ファイルを編集して、IPフォワーディングを有効にする必要があります。

    $ editor /etc/sysctl.conf
    
  2. 次の行のコメントを外すか、適宜編集してください。

    net.ipv4.ip_forward=1
    
  3. 保存した後に閉じて、次のコマンドを入力します。

  4. rootに変更し、パッケージに署名したGPGキーをダウンロードする

    $ sudo -s
    # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
    
  5. 適切なOpenVPNパッケージのURLを``sources.list``ファイルに追加します。

    # echo "deb http://build.openvpn.net/debian/openvpn/release/2.5 buster main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
    # exit
    

    パスワードプロンプト」では、ログインに最低でもOpenVPN `バージョン2.4.8 <https://community.openvpn.net/openvpn/ticket/1215>`_が必要なので、OpenVPN 2.5をダウンロードしました。

  6. 次にOpenVPNをダウンロードします。

    $ sudo apt install openvpn
    

    バージョンを確認したい場合は、``--version``を呼び出して、次のように表示します。

    $ sudo openvpn --version
    OpenVPN 2.5_beta3 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep  1 2020
    library versions: OpenSSL 1.1.1d 10 Sep 2019, LZO 2.10
    Originally developed by James Yonan
    Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
    Compile time defines: enable_async_push=no enable_comp_stub=no enable_crypto_ofb_cfb=yes enable_debug=yes enable_def_auth=yes enable_dependency_tracking=no \ enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown enable_fast_install=needless enable_fragment=yes enable_iproute2=yes \ enable_libtool_lock=yes enable_lz4=yes enable_lzo=yes enable_maintainer_mode=no enable_management=yes enable_multihome=yes enable_pam_dlopen=no enable_pedantic=no \ enable_pf=yes enable_pkcs11=yes enable_plugin_auth_pam=yes enable_plugin_down_root=yes enable_plugins=yes enable_port_share=yes enable_selinux=no \ enable_shared=yes enable_shared_with_static_runtimes=no enable_silent_rules=no enable_small=no enable_static=yes enable_strict=no enable_strict_options=no \ enable_systemd=yes enable_werror=no enable_win32_dll=yes enable_x509_alt_username=yes with_aix_soname=aix with_crypto_library=openssl with_gnu_ld=yes \ with_mem_check=no with_sysroot=no
    

2.Easy-RSAのインストール

PKIを構築するために、サーバとクライアントのマシンにEasy-RSAの最新バージョンをダウンロードします。最新のリリースを入手するには、EasyRSAの公式GitHubプロジェクトの`Releasesページ<https://github.com/OpenVPN/easy-rsa/releases>`_にアクセスし、``.tgz`で終わるファイルのダウンロードリンクをコピーして、以下のコマンドに貼り付けます。

  1. 最新版のダウンロード

    $ cd ~
    $ wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz
    
  2. タールボールの解凍

    $ cd ~
    $ tar xvf EasyRSA-3.0.7.tgz
    $ mv EasyRSA-3.0.7/ easyrsa/ # rename folder
    

3.OpenVPN サーバの PKI を作成する

OpenVPNサーバの秘密鍵と証明書を作成する前に、OpenVPNサーバにローカルのPublic Key Infrastructureディレクトリを作成する必要があります。このディレクトリは、サーバやクライアントの証明書要求を、CAサーバに直接行うのではなく、管理するために使用します。

OpenVPNサーバにPKIディレクトリを構築するには、``vars``というファイルに、いくつかのデフォルト値を入力する必要があります。

  1. ``vars``ファイルの作成

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. ファイルを開いたら、次の2行をペーストします。

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    OpenVPNサーバのこの``vars``ファイルで必要なのは、認証局として使用しないので、この2行だけです。これにより、秘密鍵や証明書要求が楕円曲線暗号(ECC)を使用して鍵を生成するように設定され、クライアントやOpenVPNサーバの署名が安全に行われるようになります。

    暗号アルゴリズムの選択に関しては、`このチュートリアルの<https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-centos-8>`_のモデルに従っていますが、あなたの特定のニーズに応じてこれらをカスタマイズすることができます。

  3. PKIの初期化

    ``vars``のファイルに入力したら、PKIディレクトリの作成に進むことができます。これを行うには、easyrsa スクリプトを init-pki オプション付きで実行します。

    $ ./easyrsa init-pki
    

    OpenVPNサーバのPKIを初期化したら、次のステップである、OpenVPNサーバの証明書要求と秘密鍵の作成に移ることができます。

4.``server.req``と``server.key``を作成。

OpenVPNサーバーにすべての前提条件がインストールされたので、次のステップでは、秘密鍵(秘密にしておきたい)と、OpenVPNサーバー上の証明書署名要求(.csr)からなる鍵ペアを生成します。

一般論として、鍵とリクエストを生成するシステムでは、通常サーバーはパスワードの入力なしで起動する必要があるため、これらのファイルは``nopass``の引数を使って暗号化されないままにしておきます。これは、*暗号化されていないキー*を生成するので、そのアクセスとファイルのパーミッション*を注意深く保護することを心掛けてください。

Tip

OpenVPNの設定メモです。

  1. The server, and each client, must have their own cert and key

    file. The server and all clients will use the same CA file.

  2. サーバー証明書は以下のものが必要です。

  • keyUsage:  digitalSignature, keyEncipherment

  • extendedKeyUsage: serverAuth

  1. サーバーへの署名要求の作成

    非rootユーザーでOpenVPNサーバーの``~/easyrsa``ディレクトリに移動し、以下のコマンドを入力します。

    $ cd easyrsa/
    $ ./easyrsa gen-req server nopass
    

    これにより、サーバーの秘密鍵と、``server.req``という証明書要求ファイルが作成されます。

    署名済みの証明書ができたら、それをOpenVPNサーバーに転送します。

  2. 鍵をOpenVPNサーバのディレクトリにコピーする

    $ sudo cp /home/admin/EasyRSA/pki/private/server.key /etc/openvpn/server/
    

これらの手順を完了すると、OpenVPN サーバーの秘密鍵の作成が完了します。また、OpenVPN サーバー用の Certificate Signing Request も作成されています。

Tip

証明書署名要求のファイル拡張子

CAやHSMのチュートリアルで採用されているファイル拡張子は、.csr``のファイルを作成することを示していますが、Easy-RSAでは.req``の拡張子で証明書署名要求を作成します。

ここでは、両方の拡張子を使い分けながら、正しいファイルを認証局に転送し、``.crt``の拡張子を持つ最終的な証明書を生成することを確認します。

このガイドの次のセクションでは、``.req``のファイルに、HSM 2デバイス上にデプロイされたCAで署名します。この目的のために、専用のマシンを使ってリクエストに署名することにします。

5.署名・回収 server.crt

以下の手順では、server.req``(または``server.csr)のファイルをCAシステムに転送する必要があります。

転送自体にはセキュリティ上の問題はありませんが、転送が信頼できない場合には、受信したファイルが送信者のコピーと一致するかどうかを確認するのが賢明です。

これらの手順を踏むために、Easy-RSAで証明書署名要求を生成した後に署名するために、`この説明書<certificate-authority.html#creating-the-intermediate-certificate-authority>`_に大きく依存することになります。

  1. server.req ファイルに署名する。

    HSMにアクセスする専用のローカルマシンで、Opensc 0.20が提供するツールを使用して、``.req``のファイルに署名し、OpenVPNサーバに送り返します。ここでは、サーバーマシンからCAマシンにファイルを転送したと仮定します。

    まず、HSM Nitrokeyを接続して、使用可能なキーをリストアップするために、この指示を入力します。

    1. 利用可能なデバイスのリストを問い合わせる

      $ p11tool --list-all
      

      (必須ステップ) 初めてCAで証明書に署名する場合は、HSMからCAの秘密鍵のURIを取得し、それを設定ファイルに含めるとよい。

      注釈

      キーのURIはこのフォーマットでなければなりません。

      pkcs11:model=PKCS%2315%20emulated;manufacturer=www.CardContact.de;serial=DENK0104068;token=SmartCard-HSM%20%28UserPIN%29%00%00%00%00%00%00%00%00%00;id=%E0%16%1C%C8%B6%F5%D6%6A%C6%83%5E%CD%EC%B6%23%FC%05%06%A6%75;object=root;type=private
      
    2. ``openvpn/``のディレクトリを``certificate-authority/``の下に作成します。

      $ mkdir/opt/certificate-authority/
      $ cd /opt/certificate-authority/
      
    3. サインは``server.req``。

      $ openssl ca -config sign_server_csrs.ini -engine pkcs11 -keyform engine -days 375 -notext -md sha512 -create_serial -in server.req -out /home/user/pki/issued/server.crt
      
  2. 5.2.``server.crt``のファイルをサーバー・マシンに取得する。

    1. 署名済みの証明書をサーバーに転送する

      CAのマシンから、``server.crt``と``chain.crt``のファイルをOpenVPNサーバにコピーします。この例では、``scp``のコマンドを以下のように使用します。

      $ scp openvpn/{server.crt,chain.crt} admin@your_openvpnserver_ip:/tmp
      
    2. サーバーのディレクトリに証明書を置く

      $ mv /tmp/{server.crt,chain.crt} /etc/openvpn/server
      

      警告

      CA証明書と``chain.crt``

      上の例では、CAは署名された sever 証明書を返し、``CA.crt``であるCA証明書``chain.crt``のファイルを含めます。これは安全でないチャンネルで行うことができますが、トランスポートが信頼されていない場合、クライアントは受信した``chain.crt``が有効であるかどうかを確認することが推奨されます。

      ターゲット・マシンでは、``chain.crt``のファイルを``CA.crt``にリネームすることが可能です。しかし、次の説明では、``chain.crt``を使用します。

6.OpenVPNサーバーの設定

TLSを使用する接続では、認証のために複数の`証明書と鍵が必要になります<https://wiki.teltonika-networks.com/view/OpenVPN_configuration_examples>`_。これらの証明書を発行して署名したので、正しいディレクトリに配置します。ルートディレクトリに配置しなければならない証明書と鍵の内訳は以下の通りです。

OpenVPN server

    - The root certificate file (CA.crt or chain.crt in our setup)
    - Server certificate
    - Server key
    - Diffie Hellman Parameters (optional)

OpenVPNサーバーでは、お気に入りのテキストエディタで設定ファイル``server.conf``を作成します。このファイルは必要に応じて設定することができますが、署名したファイルに選択した名前に従って、サーバー証明書と鍵のセクションを変更するようにしています。

# OpenVPN Server Certificate - CA, server key and certificate
ca chain.crt
cert server.crt
key server.key

以下は、これらの手順をテストするために使用できる設定ファイルです。

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
tls-version-min 1.2 # Lower boundary for TLS version
tls-version-max 1.2 # Higher boundary for TLS version

この設定が正しく機能するかどうかをテストするには、このコマンドを使用します。

$ sudo openvpn --server --config server.conf

7.サーバーでOpenVPNサービスを開始する

OpenVPNサービスをsystemctlに追加して有効にし、以下のコマンドで起動します。

$ sudo systemctl -f enable openvpn@server
$ sudo systemctl start openvpn@server

OpenVPNサービスがアクティブかどうかをダブルチェックするには、このコマンドを使います。

$ sudo systemctl status openvpn@server

この時点でOpenVPNが起動しているはずです。


クライアント側の設定

1.OpenVPNとEasy-RSAのインストール

  1. ソフトウェアのインストール

    OpenVPN 2.4.9とEasy-RSA 3.0.7をインストールするには、直接``dnf install``を使うことができます。

    $ sudo dnf install openvpn easy-rsa
    
  2. そして、非rootで``Easy-RSA``というEasy RSA用のディレクトリを作成します。

    $ mkdir ~/easyrsa
    
  3. そして、先ほどインストールしたEasy RSAパッケージにリンクさせます。

    $ ln -s /usr/share/easy-rsa/3/* ~/easyrsa/
    

2.OpenVPNクライアント用のPKIを作成する

OpenVPNサーバでPKIを作成したのと同じように、クライアント側でもEasy-RSAを使ったPKIを作成します。

3.``client.req``と``client.key``を作成する。

サーバー上でキーペアを発行したのと同じ方法で、クライアント用のキーペアを生成します。これは client.req ファイルと client.key ファイルで構成されます。後者は、クライアントマシン上で秘密にしておく必要があります。

4.``client.req``に署名し、``client.crt``のファイルを発行する。

``client.req``のファイルをCA機に転送するには、``server.req``のファイルを転送したときと同じ方法で行います。

転送が完了したら、CAのマシンで次のコマンドを使って証明書署名要求ファイルに署名します。

$ openssl ca -config sign_server_csrs.ini -engine pkcs11 -keyform engine -days 375 -notext -md sha512 -create_serial -in client.req -out /home/user/pki/issued/client.crt

5.CA機からNitrokeyに``client.crt``をインポートする。

client.crt``のファイルを作成した後、CAマシンにNitrokey Pro 2デバイスを接続し、.crt``をこのコマンドでPro 2デバイスにインポートします。

$ pkcs15-init --store-certificate client.crt --id 3

キーがNitrokeyに有効に保存されているかどうかは、このコマンドで確認できます。

$ pkcs15-tool -c

あるいは、代わりに

$ pkcs11-tool --list-objects

その他のコマンドについては、`OpenSC wiki <https://github.com/OpenSC/OpenSC/wiki/OpenPGP-card>`_を参照してください。

6.CA機から``chain.crt``のファイルを取得します。

While we keep the client.crtstored on the nitrokey Pro 2 device, we must retrieve the chain.crt file on the client machine, and store it in the adequate directory. We may use scp as in the method explained in the server section of this guide.

7.クライアントがNitrokeyと対話できるように設定します。

さて、クライアントマシンに戻って、Nitrokey Proを接続し、それを使ってサーバーとのVPN接続を確立します。一般的に、TLSを使用した接続では、認証のために複数の証明書と鍵が必要になります。

OpenVPN client
    - The root certificate file (`chain.crt`)
    - Client certificate
    - Client key

このガイドでは、以下の``client.conf``ファイルを作成し、必要なオプションを適宜追加しています。

client
dev tun
proto udp
remote <server> 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
remote-cert-tls server
cipher AES-256-CBC
verb 3
redirect-gateway def1
tls-version-min 1.2 # Lower boundary for TLS version
tls-version-max 1.2 # Higher boundary for TLS version
  1. 正しいオブジェクトの決定

    各 PKCS#11 プロバイダーは、複数のデバイスをサポートすることができます。利用可能なオブジェクトのリストを表示するには、次のコマンドを使用できます。

    $ openvpn --show-pkcs11-ids /usr/lib64/pkcs11/opensc-pkcs11.so
    
    The following objects are available for use.
    Each object shown below may be used as parameter to
    
    --pkcs11-id option please remember to use single quote mark.
    
    Certificate
            DN:             CN=client
            Serial:         E53DA75C5B8F1518F520BCEF0128C09F
            Serialized id:  pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03
    

    各証明書と秘密鍵のペアは、ユニークな``Serialized id``の文字列を持っています。要求された証明書のシリアル化されたid文字列は、設定ファイルで指定する必要があります。これを行うには、シングルクォートマークを使用して、``pkcs11-id``オプションを追加します。

    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    
  2. 取得したシリアライズドIDを設定ファイルに追加する

    お好きなテキストエディターでserver.confファイルを開き、``Serialized id``に注意しながら、以下の行を追加します。

    pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so
    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    

    OpenVPNの<https://openvpn.net/community-resources/how-to/>`_認証に関連する`設定を追加する場合は、オプションですが、鍵の管理を処理するために数行を追加することもできます。

    注釈

    クリックするとコードが表示されます

    # nitrokey config
    
    pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so
    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    # pkcs11-pin-cache 300
    # daemon
    # auth-retry nointeract
    # management-hold
    # management-signal
    # management 127.0.0.1 8888
    # management-query-passwords
    pkcs11-cert-private 1 # Prompt for PIN
    

    オプションステップ

    Nitrokeyにトークンがある場合とない場合の構成をテストする必要がある場合は、同じ``client.conf``に行を追加し、必要に応じて関連する行をコメント/アンコメントすることができます。

    注釈

    クリックするとコードが表示されます

    # non_nitrokey login
    
    # cert client.crt
    # key client.key
    # tls-auth ta.key 1
    
  3. OpenVPNクライアントの設定

    最終的な設定ファイル client.conf は、以下のようになります。

    client
    dev tun
    proto udp
    remote <server> 1194
    resolv-retry infinite
    nobind
    user nobody
    group nobody
    persist-key
    persist-tun
    ca ca.crt
    remote-cert-tls server
    cipher AES-256-CBC
    verb 3
    redirect-gateway def1
    tls-version-min 1.2 # Lower boundary for TLS version
    tls-version-max 1.2 # Higher boundary for TLS version
    
    # nitrokey login
    
    pkcs11-providers /usr/lib64/pkcs11/opensc-pkcs11.so
    pkcs11-id 'pkcs11:model=pkcs11:model=PKCS%NNNN%20emulated;token=User%20PIN%20%28OpenPGP%20card%29;manufacturer=ZeitControl;serial=000NNNNNN;id=%03'
    # pkcs11-pin-cache 300
    # daemon
    # auth-retry nointeract
    # management-hold
    # management-signal
    # management 127.0.0.1 8888
    # management-query-passwords
    pkcs11-cert-private 1 # Prompt for PIN
    
    # OR
    
    # non_nitrokey login
    
    # cert client.crt
    # key client.key
    # tls-auth ta.key 1
    
  4. Configure OpenVPN (Windows only)

    ハンドシェイクを確立するためには、OpenVPNに含まれるOpenSSLを設定する必要があります。

    Create the directory ssl in C:\Program Files\OpenVPN and create file openssl.cnf with the following content :

    openssl_conf = default_conf

    [default_conf ] ssl_conf = ssl_sect

    [ssl_sect ] system_default = ssl_default_sect

    [ssl_default_sect ] 署名アルゴリズム = RSA+SHA512:ECDSA+SHA512:RSA+SHA384:ECDSA+SHA384:RSA+SHA256:ECDSA+SHA256 MaxProtocol = TLSv1.2 MinProtocol = TLSv1.2

    この修正により、` <https://support.nitrokey.com/t/nitrokey-pro-with-openssl-1-1-1-tls-1-3-and-rsa-based-certificates/2180/2>`__、` <https://support.nitrokey.com/t/openvpn-openssl-error-141f0006/2637>` __、` <https://community.openvpn.net/openvpn/ticket/1215>`__ で報告されているようなエラーは発生しなくなります。

  5. 既知の問題

    OpenSCでのOpenVPNログインには、いくつかの既知の問題があります。これらの問題については こちら を参照してください。

8.OpenVPNクライアントの起動

  1. クライアントでOpenVPNサービスを開始する

    OpenVPNサービスを有効にし、以下のコマンドで起動してください。

    $ sudo systemctl -f enable openvpn-server@server.service
    $ sudo systemctl start openvpn-server@server.service
    

    OpenVPNサービスがアクティブかどうかを再確認するには、このコマンドを使用します。

    $ sudo systemctl status openvpn-server@server.service
    
  2. ユーザーPINの入力

    OpenVPNクライアントを実行する際に、NitrokeyのPINを入力する必要があります。

    $ sudo openvpn --client --config client.conf
    Fri Sep 11 17:42:01 2020 OpenVPN 2.4.9 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2020
    Fri Sep 11 17:42:01 2020 library versions: OpenSSL 1.1.1g FIPS  21 Apr 2020, LZO 2.08
    Fri Sep 11 17:42:01 2020 PKCS#11: Adding PKCS#11 provider '/usr/lib64/pkcs11/opensc-pkcs11.so'
    Enter User PIN (OpenPGP card) token Password: ******
    

    警告

    Unfortunately OpenVPN doesn’t seem to be able to establish a handshake on some operating systems and stops at an error as reported here, here and here

    This is what the error output looks like:
    
    $ sudo openvpn --client --config client.conf
    Fri Sep 11 17:42:01 2020 OpenVPN 2.4.9 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Apr 24 2020
    Fri Sep 11 17:42:01 2020 library versions: OpenSSL 1.1.1g FIPS  21 Apr 2020, LZO 2.08
    Fri Sep 11 17:42:01 2020 PKCS#11: Adding PKCS#11 provider '/usr/lib64/pkcs11/opensc-pkcs11.so'
    Enter User PIN (OpenPGP card) token Password: ******``
    Fri Sep 11 17:42:12 2020 TCP/UDP: Preserving recently used remote address: [AF_INET]18.157.180.240:1194``
    Fri Sep 11 17:42:12 2020 Socket Buffers: R=[212992->212992] S=[212992->212992]``
    Fri Sep 11 17:42:12 2020 UDP link local: (not bound)
    Fri Sep 11 17:42:12 2020 UDP link remote: [AF_INET]18.157.180.240:1194
    Fri Sep 11 17:42:12 2020 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
    Fri Sep 11 17:42:12 2020 TLS: Initial packet from [AF_INET]18.157.180.240:1194, sid=d79690cf 9e38ce89
    Fri Sep 11 17:42:12 2020 VERIFY OK: depth=1, CN=server_CA
    Fri Sep 11 17:42:12 2020 VERIFY KU OK
    Fri Sep 11 17:42:12 2020 Validating certificate extended key usage
    Fri Sep 11 17:42:12 2020 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
    Fri Sep 11 17:42:12 2020 VERIFY EKU OK
    Fri Sep 11 17:42:12 2020 VERIFY OK: depth=0, CN=server
    Fri Sep 11 17:42:12 2020 OpenSSL: error:141F0006:SSL routines:tls_construct_cert_verify:EVP lib
    Fri Sep 11 17:42:12 2020 TLS_ERROR: BIO read tls_read_plaintext error
    Fri Sep 11 17:42:12 2020 TLS Error: TLS object -> incoming plaintext read error
    Fri Sep 11 17:42:12 2020 TLS Error: TLS handshake failed
    Fri Sep 11 17:42:12 2020 SIGUSR1[soft,tls-error] received, process restarting
    Fri Sep 11 17:42:12 2020 Restart pause, 5 second(s)
    

    一部の報告では、ターミナル上でPINの入力を求められないことがあります。これを回避するには、このコマンドを使ってPINでログインする方法があります。

    $ telnet 8888 password 'User PIN (OpenPGP card) token' <PIN>
    

    代わりに、systemdサポートを無効にしてOpenVPN `クライアントを再コンパイルすると、期待通りにPINの入力を求められます。

    また、OpenVPNインスタンスにViscosityクライアントでログインする方法もあります。Viscosityクライアントは、特にPINの入力において優れたユーザーエクスペリエンスを提供します。