`
flashing
  • 浏览: 353027 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

CentOS 7下面OpenVPN和OpenSSL的问题总结

阅读更多

今天遇到个实际的需求,最后决定把某个远程内网的虚拟机上的测试服务器给映射到公网上来,想到多年前就用过OpenVPN来做这个事情,所以翻看了一下http://flashing.iteye.com/blog/575402 以前的文章,按说照做即可,结果很悲桑的发现...things changed~

其实主要原因是Centos 7移除了Openssl的MD5支持(听了一年关于centos7的各种吐槽,但是自己没实际用,这马上就掉到坑里了),但是windows/ubuntu(使用14.04LTS测试),openssl仍然默认以md5作为散列算法并且可以正确识别md5散列算法,所以就悲剧了,只有cenots7不好用。关键是这个错误是大错误被小错误还掩盖了一下,所以很难被发现。

错误关键词:

A: VERIFY ERROR: depth=1, error=certificate is not yet valid

or error 9 at 1 depth lookup:certificate is not yet valid

B: VERIFY ERROR: depth=0, error=certificate signature failure
C: error 7 at 0 depth lookup:certificate signature failure

 

先把这些给装上:

sudo yum update
sudo yum install -y wget ntp ntpdate openvpn easy-rsa bridge-utils


解决A:

首先错误A是因为centos7默认安装(没有桌面)的情况下timezone没设置对并且时间没有校对,导致服务器时间还没到证书的签名时间,所以需要从新设置一下timezone并校对时间:

sudo timedatectl set-timezone Asia/Shanghai

sudo ntpdate time.windows.com&

sudo systemctl enable ntpd

sudo systemctl start ntpd
sudo timedatectl set-ntp true
然后执行date命令看看时间是否正确,执行timedatectl看看设置的时区等信息是否正确,ntp是否开启。

 

      Local time: Thu 2015-10-15 12:37:25 CST
  Universal time: Thu 2015-10-15 04:37:25 UTC
        Timezone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

 

对于B和C,有两个问题需要解决。

第一是生成证书时候的Common Name其实是不能重复的,ca的,server的以及每个client的common都必须是唯一的,虽然校验与否是openssl的事情,大多数情况可能重复了也没问题,但是仍然建议不要重复。

from: http://stackoverflow.com/questions/19726138/openssl-error-18-at-0-depth-lookupself-signed-certificate

Whatever method you use to generate the certificate and key files, the Common Name value used for the server and client certificates/keys must each differ from the Common Name value used for the CA certificate. Otherwise, the certificate and key files will not work for servers compiled using OpenSSL.

 第二是最终问题,也就是centos7下面的openssl不支持md5,校验可以通过下面的命令:

openssl verify -CAfile ca.crt -purpose sslclient weblogic.crt

或者直接
openssl verify -CAfile ca.crt weblogic.crt

 服务器当然就是

openssl verify -CAfile ca.crt -purpose sslserver server.crt
可以看到windows/ubuntu下都可以成功显示OK,centos 7则报告错误,这是openvpn报告:

error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm:a_verify.c:179: 错误的根源。

 

仍然有两种方法来解决,第一是通过环境变量打开centos7下的openssl对md5的支持:

from http://software-engineer.gatsbylee.com/centos7openvpn-verify-error-depth0-errorcertificate-signature-failure/

然而我这么做并未成功,主要是如果是在shell里面,su添加环境变量之后,

sudo openvpn --config /etc/openvpn/client.ovpn

是可以成功的,原因是这都是root的变量,但是centos7(7.1)的服务模式,按照原文添加在NetworkManager里面,并未生效,原因未知。

考虑到这种情况主要是之前已经有了多个证书的情况才需要仔细考虑兼容,我的情况是从新发布证书,所以果断放弃研究这个分支,不再使用md5,改用其他散列算法从新生成证书。

因为我对openssl不熟悉,也不知道在哪里设置md算法easy-rsa才可以识别,碰巧搜到github的一个patch的diff,才明白原来是在openssl.cnf里面设置。

cenots在/usr/share/easy-rsa/2.0/下面,windows就在openvpn目录里面,把windows里面openssl-1.0.0.cnf内容当中的

default_md    = md5            # use public key default MD

改为

default_md    = sha256            # use public key default MD

看了一下centos的easy-rsa默认设置,也是sha256,这把放心了。

然后从新生成了所有的证书,放入centos下面经过测试之后好用了。成功拨号之后ifconfig可以看到有tap0设备。

 

附1:几个安装的参考网址,有的有用有的没用(其实按照easy-rsa下面的readme.txt操作即可并不麻烦,当然需要改一下vars的变量设置):

http://flashing.iteye.com/blog/575402

http://www.cnblogs.com/szzchristy/p/3491757.html

https://www.digitalocean.com/community/tutorials/how-to-setup-and-configure-an-openvpn-server-on-centos-7

http://www.server-world.info/en/note?os=CentOS_6&p=openvpn

 

附2:centos 7 linux下面启动openvpn

拷贝client.ovpn(或者server.opvn,我这里是linux做客户端,所以是起名client.ovpn),ca.crt, 客户端证书crt文件和key文件到/etc/openvpn

sudo openvpn --config /etc/openvpn/client.ovpn

可以直接连接用作测试,如果成功,可以安装为服务

先把/etc/openvpn/client.ovpn复制为/etc/openvpn/client.conf

sudo systemctl enable openvpn@client.service
sudo systemctl start openvpn@client.service

这里@是指/etc/openvpn下面对应的conf文件名

当然停止和注销服务就是

sudo systemctl stop openvpn@client.service

sudo systemctl disable openvpn@client.service
查看服务状态是

sudo systemctl status openvpn@client.service

 

 

 

 

 

 

 

分享到:
评论
6 楼 flashing 2015-10-17  
jz20110918 写道
目前已经有了多个证书的情况下需要考虑兼容性,所以不知楼主有没有好的办法?

或者干脆卸载了openssl,自己编译安装一个得了。
5 楼 flashing 2015-10-17  
jz20110918 写道
flashing 写道
jz20110918 写道
您好,我现在也遇到相似问题,windows作为服务端生成证书后copy到centos7客户端环境下连接报错VERIFY ERROR: depth=0, error=certificate signature failure,生成证书时候的Common Name是唯一的,两边openssl同时使用MD5,通过下面的命令:

openssl verify -CAfile ca.crt -purpose sslclient weblogic.crt

或者直接
openssl verify -CAfile ca.crt weblogic.crt
显示也是ok的,但是错误依然存在。求解!


你是设置环境变量支持的md5吧,这个环境变量当前用户设置的,和sudo情况下的是不一样的。如果是从头来的建议还是直接用sha256,避免很多麻烦。


关键现在服务端已经使用MD5方式生成证书统一发放给不同客户端,要修改只能在客户端修改centos7支持MD5方式
export NSS_HASH_ALG_SUPPORT=+MD5
export OPENSSL_ENABLE_MD5_VERIFY=1

[Service]
Environment="OPENSSL_ENABLE_MD5_VERIFY=1 NSS_HASH_ALG_SUPPORT=+MD5"
$ sudo systemctl daemon-reload
$ sudo systemctl restart NetworkManager.service

根据openssl verify -CAfile ca.crt weblogic.crt验证结果显示ok


你执行命令的时候,是在shell里面,比如你的用户名是tom,tom现在export了这两个环境变量,当然tom执行openssl可以通过。
如果你sudo想通过,你得su然后设置这两个环境变量。关键问题是,你最终是什么方式启动openvpn,命令行还是服务?如果是服务systemctl启动的话,这个模式我真不太懂还没看cenots7的文档,和以前的centos6的启动脚本又不太一样,而且最麻烦的是因为openvpn启动设置是依赖于网络服务的,所以这个变量加入在网络服务配置里面,我试过但是看起来似乎不好用。所以我也没辙了,只能从新用sha256签发证书。
我想说的是,第一理顺清楚环境变量和用户的关系,第二就是网络服务里面加变量怎么能好用,真搞定了千万告诉我一下。。。
4 楼 jz20110918 2015-10-16  
目前已经有了多个证书的情况下需要考虑兼容性,所以不知楼主有没有好的办法?
3 楼 jz20110918 2015-10-16  
flashing 写道
jz20110918 写道
您好,我现在也遇到相似问题,windows作为服务端生成证书后copy到centos7客户端环境下连接报错VERIFY ERROR: depth=0, error=certificate signature failure,生成证书时候的Common Name是唯一的,两边openssl同时使用MD5,通过下面的命令:

openssl verify -CAfile ca.crt -purpose sslclient weblogic.crt

或者直接
openssl verify -CAfile ca.crt weblogic.crt
显示也是ok的,但是错误依然存在。求解!


你是设置环境变量支持的md5吧,这个环境变量当前用户设置的,和sudo情况下的是不一样的。如果是从头来的建议还是直接用sha256,避免很多麻烦。


关键现在服务端已经使用MD5方式生成证书统一发放给不同客户端,要修改只能在客户端修改centos7支持MD5方式
export NSS_HASH_ALG_SUPPORT=+MD5
export OPENSSL_ENABLE_MD5_VERIFY=1

[Service]
Environment="OPENSSL_ENABLE_MD5_VERIFY=1 NSS_HASH_ALG_SUPPORT=+MD5"
$ sudo systemctl daemon-reload
$ sudo systemctl restart NetworkManager.service

根据openssl verify -CAfile ca.crt weblogic.crt验证结果显示ok
2 楼 flashing 2015-10-16  
jz20110918 写道
您好,我现在也遇到相似问题,windows作为服务端生成证书后copy到centos7客户端环境下连接报错VERIFY ERROR: depth=0, error=certificate signature failure,生成证书时候的Common Name是唯一的,两边openssl同时使用MD5,通过下面的命令:

openssl verify -CAfile ca.crt -purpose sslclient weblogic.crt

或者直接
openssl verify -CAfile ca.crt weblogic.crt
显示也是ok的,但是错误依然存在。求解!


你是设置环境变量支持的md5吧,这个环境变量当前用户设置的,和sudo情况下的是不一样的。如果是从头来的建议还是直接用sha256,避免很多麻烦。
1 楼 jz20110918 2015-10-16  
您好,我现在也遇到相似问题,windows作为服务端生成证书后copy到centos7客户端环境下连接报错VERIFY ERROR: depth=0, error=certificate signature failure,生成证书时候的Common Name是唯一的,两边openssl同时使用MD5,通过下面的命令:

openssl verify -CAfile ca.crt -purpose sslclient weblogic.crt

或者直接
openssl verify -CAfile ca.crt weblogic.crt
显示也是ok的,但是错误依然存在。求解!

相关推荐

    CentOS7环境下编译的openssl 3.0动态库和静态库

    总结来说,这个资源为在CentOS7上使用OpenSSL 3.0提供了便捷的途径,无论是开发新应用还是升级现有系统,都可以直接利用这些预编译的库。然而,用户在使用时仍需注意兼容性问题,确保所有依赖项和配置都与OpenSSL ...

    Centos7升级openssl-3.2.0和openssh-9.6p1笔记和软件

    总结来说,升级CentOS 7上的OpenSSL和OpenSSH涉及到下载源码、编译、安装、更新系统链接以及重启服务。这个过程虽然复杂,但却是确保系统安全的重要步骤。务必在有经验的情况下进行,或者在有备份的前提下,以避免...

    openssl-1.1.1m centos 7 rpm

    在本场景中,我们讨论的是 OpenSSL 的版本 1.1.1m,在 CentOS 7 系统上的 RPM 包安装。RPM(Red Hat Package Manager)是基于 Linux 的软件包管理器,用于简化软件的安装、升级和卸载过程。 标题中的 "openssl-...

    openssl CentOS7的rpm安装包

    openssl-1.1.1k-1.el7.centos.x86_64 openssl-debuginfo-1.1.1k-1.el7.centos.x86_64 openssl-devel-1.1.1k-1.el7.centos.x86_64 openssl CentOS7安装包,解决CVE-2021-3450和CVE-2021-3449

    CentOS7离线升级openssl1.1.1w,openssh9.6p1,所需资源包

    在IT行业中,操作系统和安全软件的及时更新至关重要,特别是对于服务器环境。本主题涉及的是如何在没有网络连接的情况下,对CentOS7系统进行openssl和...同时,这个过程也锻炼了系统管理员的动手能力和问题解决能力。

    centos7 openssh-9.1 openssl-1.1.1q rpm离线安装包

    CentOS 7作为一款广泛使用的Linux发行版,其安全服务主要依赖于OpenSSH和OpenSSL。本文将深入探讨如何在CentOS 7上进行OpenSSH 9.1和OpenSSL 1.1.1q的离线安装,并解释这两个组件的重要性及其更新过程。 OpenSSH是...

    openssl-1.1.1o centos7 rpm 最新版

    centos7 openssl升级rpm包,openssl-1.1.1o-1.el7.x86_64.rpm

    关于openssl centos7.4.1708相关rpm包

    关于openssl centos7.4.1708相关rpm包

    centos7 升级openssh9.0、openssl111q脚本

    在CentOS 7中,OpenSSH和OpenSSL默认的版本可能较旧,为保证系统的安全性,及时升级这些组件至关重要。升级过程通常涉及到下载新版本的源代码、编译安装以及配置系统服务等步骤。这个名为"centos7 升级openssh9.0、...

    centos7.9的openssh和openssl升级包(openssh-9.4p1和openssl-1.1.1w)

    首先备份原有库文件在进行卸载升级 cp /usr/bin/openssl /usr/bin/openssl-1.0.2k cp /usr/lib64/libcrypto.so....卸载openssh和openssl,包括openssl-libs 然后解压安装 如有lib库文件异常,使用备份的库文件直接恢复

    详解Linux(centos7)下安装OpenSSL安装图文方法

    操作系统:CentOs7安静 OpenSSL Version:openssl-1.0.2j.tar.gz 目前版本最新的SSL地址为http://www.openssl.org/source/openssl-1.0.2j.tar.gz 1、将下载的压缩包放在根目录, 2、在文件夹下解压缩,命令:tar ...

    centos7升级安装Openssl.txt

    这里是Linux Centos下升级Openssl使用的所有依赖包,当然也是Nginx或者Keepalived安装所需要的依赖包。按需使用。

    CentOS7升级openssl、openssh

    漏扫报告中提示ssl、ssh版本有漏洞,本文档主要介绍在CentOS7中升级openssl、openssh步骤,经亲自测试可用,所有安装包通过网络下载源码,编译安装进行升级。

    Linux系统centos7环境下安装openssl1.0.2所需安装包及nginx离线安装所需全部依赖包,均可使用

    压缩包内包含openssl1.0.2的安装包及全部依赖环境,下载openssl最新版可到官网http://www.openssl.org/source/下载,然后安装此依赖包均可。没有设置下载积分,如果有积分一定是CSDN自己搞得鬼,也可在百度云盘上去...

    CentOS7 nginx离线安装gcc/pcre-devel/openssl-devel/zlib-devel包

    本教程将详细介绍如何在CentOS 7上离线安装GCC、PCRE-devel、OpenSSL-devel和Zlib-devel这些重要的开发工具包,这些都是构建和编译Nginx web服务器所必需的依赖。以下是一个详细的步骤指南。 首先,`CentOS7 nginx...

    CentOS7安装指南

    "CentOS7安装指南" 本指南将指导您完成 CentOS 7 的安装过程,涵盖从虚拟机设置到安装完成后的基本配置。 虚拟机设置 在开始安装 CentOS 7 之前,需要设置虚拟机的网络适配器模式为“桥接模式”。这将允许虚拟机...

    centos配置openmeetings

    7. **安装MySQL**:MySQL是用于存储OpenMeetings数据的关系型数据库管理系统。使用`yum`命令安装MySQL服务器和php-mysql,以便与PHP集成。接着,编辑`/etc/my.cnf`配置文件,设置字符集为utf8以避免中文乱码。最后,...

    centos6,centos7,ssh和openssl安装包及一键升级脚本

    本文将深入探讨在CentOS 6和7上安装、管理和升级这两个关键组件的详细步骤。 首先,让我们关注SSH的安装。在CentOS 6和7中,可以通过`yum`包管理器来安装SSH服务。对于CentOS 6,执行以下命令: ```bash sudo yum ...

    centos 7 openssh 9.0p1+openssl 1.1.1o 2022年新版 openssh 离线数据包

    OpenSSH(Open Source Secure Shell)和OpenSSL是两个关键的安全组件,用于加密网络通信和提供安全的远程登录服务。 OpenSSH是一个开源项目,提供了SSH(Secure Shell)协议的实现,它允许用户通过加密通道进行远程...

Global site tag (gtag.js) - Google Analytics