OpenVPN SSL/TLS方式连接

2024-01-08 05:36
文章标签 连接 方式 ssl tls openvpn

本文主要是介绍OpenVPN SSL/TLS方式连接,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 前言

        本文介绍OpenVPN最后一种连接方式,通过SSL/TLS认证方式连接,也就是利用公钥密码那套:首先生成根证书秘钥、利用根证书秘钥创建根证书、生成服务器私钥,利用根证书签发服务器证书,生成Diffie-Hellman文件(用于密钥交换)、生成客户端私钥,利用根证书签发客户端证书。

        注意:OpenVPN的服务器和客户端都拥有自己的私钥和公钥,服务器和客户端是通过验证对方的证书来确定对方的合法性,所以,这里服务器的证书和客户端的证书都是由同一个根证书签发的。

        本文仍然以服务器和单个客户端的方式来介绍OpenVPN的SSL/TLS的连接方式。

二. 私钥和证书文件创建

        本文以openssl命令来创建所有的文件。建议新建一个文件路径,在这个目录中生成所有文件。

1. 创建根证书私钥文件
openssl genpkey -algorithm RSA -out ca.key -aes256

        该命令生成一个根证书的私钥文件,该私钥用aes256对称加密算法加密。

2. 利用私钥创建根证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt

        该命令生成根证书文件ca.crt。证书利用sha256哈希处理,证书有效期为10年。

3. 创建服务器私钥文件
openssl genpkey -algorithm RSA -out server.key -aes256

        该命令会生成服务器的私钥文件,其中包含服务器的私钥

4. 创建服务器证书签名请求文件
openssl req -new -key server.key -out server.csr

        该命令用于生成服务器向根证书请求证书的请求文件,输完会有如下提示,按照要求填写即可:

# openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GuangDong
Locality Name (eg, city) [Default City]:GuangZhou
Organization Name (eg, company) [Default Company Ltd]:xxxx
Organizational Unit Name (eg, section) []:xxxx
Common Name (eg, your name or your server's hostname) []:xxxx
Email Address []:xxxxPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
5. 利用根证书签发服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256

        该命令利用证书签名请求文件,使用根证书签发服务器证书。输完命令会提示输入密码,密码就是创建根证书使用的私钥

6. 生成 Diffie-Hellman 参数文件
openssl dhparam -out dh.pem 2048

        该命令用于生成密钥交换文件。用于秘钥协商阶段。

7. 创建客户端私钥文件
openssl genpkey -algorithm RSA -out client.key -aes256
8. 创建客户端证书签名请求文件
openssl req -new -key client.key -out client.csr
9. 利用根证书签发客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650 -sha256

        步骤7-9同服务器一样,这里就不多赘述。

10. 证书验证
openssl verify -CAfile ca.crt server.crt
openssl verify -CAfile ca.crt client.crt

        以上命令用于验证证书链是否完整,确保生成的证书无误,如果中间还有别的中间证书,可以通过-untrusted xxx.crt加入中间证书。

至此,我们得到了如下文件:

ca.crt:根证书

server.key:服务器私钥

server.crt:服务器证书

dh.pem:秘钥交换文件

client.key:客户端私钥

client.crt:客户端证书

        将ca.crt,server.key,server.crt和dh.pem拷贝到服务器的配置文件路径,将ca.crt,client.key和client.crt拷贝到客户端的配置文件路径。至此,用于SSL/TLS的证书完成。

三. 服务器

1. 配置文件
dev tun
ifconfig 10.8.0.1 10.8.0.2
tls-serverca ca.crt
cert server.crt
key server.key
dh dh.pemstatus openvpn-status.log
log /var/log/openvpn.log

这里新增加了tls-server,ca,cert,key和dh选项,各个选项含义如下:

tls-server:开启TLS,并且角色为TLS服务器端。

ca:指定ca根证书

cert:指定服务器证书

key:指定服务器私钥

dh:指定秘钥交换文件

2. 启动命令
openvpn --cd /etc/openvpn --config server.conf

四. 客户端

1. 配置文件
dev tun
proto udp
tls-clientremote 192.168.5.100 1194
ifconfig 10.8.0.2 10.8.0.1
verb 3ca ca.crt
cert client.crt
key client.keystatus openvpn-status.log  
log openvpn.log

        选项在前面都介绍过,此处不在赘述。

2.启动命令
openvpn --cd /etc/openvpn --config client.conf

五. 总结

        本文介绍了OpenVPN SSL/TLS的连接方式,从证书的生成到配置文件的配置,本文介绍的仍然是最简单的单客户端和服务器的模式。SSL/TLS方式的底层技术是RSA公钥密码,所以非常安全,相比于静态秘钥的方式,该方式适用于多客户端的模式。

这篇关于OpenVPN SSL/TLS方式连接的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/582467

相关文章

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我