用Easy-RSA配置OpenVPN

备注

本指南是正在进行的工作,并将根据情况进行更新。请考虑到这一状况。

本指南展示了如何配置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>`__登陆。对于软件密钥管理,我们将使用`Easy-RSA <https://github.com/OpenVPN/easy-rsa>`__,一个与OpenVPN一起发展的工具。

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).

我们将使用Easy-RSA,因为它似乎提供了一些灵活性,并允许通过外部PKI进行密钥管理。我们将在服务器上使用它来发出签名请求,并在客户端重复同样的过程。证书签名请求将由Nitorkey HSM上的CA签名,并重新传送到服务器和客户端。

先决条件

在下面的文件中,我们将需要3台不同的机器,如下。

  • OpenVPN服务器(2.5版)在Debian 10上(EC2虚拟机-AWS)。

  • Fedora 30上的OpenVPN客户端(2.4.9版)(本地机)。

  • 证书颁发机构将可以从一台装有Fedora 30的独立机器上访问(本地机器)。

为了与设备进行交互,我们需要在客户端和CA机器(本地机器)上安装`OpenSC 0.20 <https://github.com/OpenSC/OpenSC/wiki>`__。你可以按照`这个链接(*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>`__。

我们将使用以下硝基钥匙进行物理钥匙管理。

作为提醒,要在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/>`__。后面两个选项依靠软件解决方案进行密钥管理。


服务器端

1.安装OpenVPN

  1. 首先,我们需要通过编辑``/etc/sysctl.conf``文件启用IP转发功能。

    $ editor /etc/sysctl.conf
    
  2. 取消注释或相应地编辑以下一行

    net.ipv4.ip_forward=1
    
  3. 保存后关闭,并输入以下命令

    $ sysctl -p
    

    一旦IP转发完成,我们将需要为我们的Debian 10服务器下载最新版本的OpenvPN,根据`这些说明<https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos>`__。

  4. 改为根目录,下载签署软件包的GPG密钥。

    $ sudo -s
    # wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg|apt-key add -
    
  5. 在``sources.list``文件中添加足够的OpenVPN包的URL。

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

    我们下载了OpenVPN 2.5,因为 "密码提示 "至少需要OpenVPN `版本2.4.8 <https://community.openvpn.net/openvpn/ticket/1215>`__才能登录。

  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. 提取tarball文件

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

3.为OpenVPN服务器创建一个PKI

在创建OpenVPN服务器的私钥和证书之前,你需要在OpenVPN服务器上创建一个本地公钥基础设施目录。你将使用这个目录来管理服务器和客户的证书请求,而不是直接在你的CA服务器上提出。

要在你的OpenVPN服务器上建立一个PKI目录,你需要在一个名为``vars``的文件中填充一些默认值。

  1. 创建一个``vars``文件

    $ touch ~/easyrsa/vars
    $ cd easyrsa/
    $ editor vars
    
  2. 一旦文件被打开,粘贴以下两行内容

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    这是你在OpenVPN服务器上的``vars``文件中唯一需要的两行,因为它不会被用作证书授权。他们将确保你的私钥和证书请求被配置为使用椭圆曲线加密法(ECC)来生成密钥,并为你的客户和OpenVPN服务器提供安全签名。

    关于加密算法的选择,我遵循`本教程<https://www.digitalocean.com/community/tutorials/how-to-set-up-and-configure-an-openvpn-server-on-centos-8>`__中的模式,你可以根据自己的具体需要定制这些算法。

  3. 初始化PKI

    一旦你填充了``vars``文件,就可以继续创建PKI目录。要做到这一点,请使用init-pki选项运行easyrsa脚本。

    $ ./easyrsa init-pki
    

    在你初始化了OpenVPN服务器上的PKI后,你就可以进入下一步了,也就是创建OpenVPN服务器证书请求和私钥。

4.创建``server.req`和``server.key``。

现在你的OpenVPN服务器已经安装了所有先决条件,下一步是在你的OpenVPN服务器上生成一个由私钥(保密)和证书签名请求(.csr)组成的密钥对。

一般来说,在我们生成密钥和请求的系统上,这些文件通过使用``nopass``参数而不被加密,因为服务器通常需要在没有任何密码输入的情况下启动。这就产生了一个*未加密的密钥,所以要注意*保护其访问和文件权限*。

小技巧

来自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服务器生成了一个证书签名请求。

小技巧

证书签署请求的文件扩展名

CA和HSM教程采用的文件扩展名表示创建``.csr``文件,然而Easy-RSA创建的证书签署请求是``.req``扩展名。

我们将交替使用这两个扩展名,同时确保将正确的文件传输给证书颁发机构,并生成一个带有``.crt``扩展的最终证书。

在本指南的下一节,我们将用我们部署在HSM 2设备上的CA签署一个``.req``文件。为此,我将使用一台专用机器来签署请求。

5.签署和检索``server.crt``。

以下指令要求将``server.req``(或``server.csr``)文件传输到CA系统。

传输本身并不具有安全敏感性,不过,如果传输不受信任,验证收到的文件是否与发送者的副本相符是明智的。

为了完成这些步骤,我将广泛依靠`这些说明<certificate-authority.html#creating-the-intermediate-certificate-authority>`_,来签署证书签署请求,一旦我们用Easy-RSA生成它们。

  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. 将``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证书``CA.crt``,这是``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. 安装软件

    我们可以直接使用``dnf install``来安装OpenVPN 2.4.9 和 Easy-RSA 3.0.7

    $ sudo dnf install openvpn easy-rsa
    
  2. 然后我们为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机器上导入``client.crt``在Nitrokey上。

在创建了``client.crt``文件后,我们将Nitrokey Pro 2设备插入CA机器,并使用这个命令将``.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

    [ 默认配置 ] ssl_conf = ssl_sect

    [ ssl_sect ] system_default = ssl_default_sect

    [ ssl_default_sect ] SignatureAlgorithms = RSA+SHA512:ECDSA+SHA512:RSA+SHA384:ECDSA+SHA384:RSA+SHA256:ECDSA+SHA256 MaxProtocol = TLSv1.2 MinProtocol = TLSv1.2

    作此修改后,就不会出现`here<https://support.nitrokey.com/t/nitrokey-pro-with-openssl-1-1-1-tls-1-3-and-rsa-based-certificates/2180/2>`__、`here<https://support.nitrokey.com/t/openvpn-openssl-error-141f0006/2637>`__和`here<https://community.openvpn.net/openvpn/ticket/1215>`__报告的错误。

  5. 已知问题

    有一些与OpenVPN登录OpenSC有关的已知问题。请参考这些问题 这里

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. 输入你的用户密码

    在执行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码来登录。

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

    另外,你可以`重新编译OpenVPN <https://forums.openvpn.net/viewtopic.php?f=4&t=23318>`__客户端,禁用systemd支持,它将如期提示你输入密码。

    另一个选择是用Viscosity客户端登录OpenVPN实例,它提供了更好的用户体验,特别是在输入PIN码方面。