安全协议系列(五)---- IKE 与 IPSec(上)
IKE/IPSec 属于网络层安全协议,保护 IP 及上层的协议安全。自上个世纪末面世以来,关于这两个协议的研究、应用,已经非常成熟。协议本身,也在不断地进化。仅以 IKE 为例,其对应的 RFC 编号从 RFC 2407/2408/2409 演化成 RFC 4306,再演化为 RFC 5996,最新版本是 RFC 7296。
为什么要分成两个协议呢?这两个协议有什么区别?从密码学角度看,IKE 用于密钥交换,IPSec 用于保护后续的通信。而保护通信的密钥,就来自 IKE 协议运行的结果。(在 SSL/TLS 协议中,密钥生成和加密保护都是在单独一个协议中完成的,在这一点上,两者各有千秋)
本篇仍采用庖丁解牛的思路:进行一次实验,抓一次报文,用密码学验算一次。文中采用 python 作为验证工具。
实验环境搭建
服务器采用 Linux 上著名的开源实现 strongSwan(版本 4.4.0),操作系统为 Ubuntu Server 12.10(VMware 虚拟环境)。
客户端采用 Windows 7 内置的 IPSec VPN 客户端。
虚拟机运行在 Windows 7 上,配置双网卡,分别使用 NAT 和 Host-only 工作模式。两块网卡映射 Linux 中对应为 eth0 和 eth1。
IKE 与 IPSec 框架十分复杂,仅协议的使用就有多种选择。
比如 IKE 分为 IKEv1/IKEv2 两个版本,认证方式也有多种。IPSec 工作模式又分为 Tunnel 和 Transport 两种,具体实现协议又有 AH 和 ESP 之分。
考虑实际的测试环境和应用场景,本文中 IKE 协议使用 IKEv2/证书认证。IPSec 使用 Tunnel/ESP 模式。
网络拓扑如下
下载、编译、安装 strongSwan 4.4.0。一句话,就是 ./configure && make && make install 三步曲。
过程就不多说,唯一需要说明:strongSwan 要求 gmp 库支持。为简单起见,所有命令行操作均使用 root 身份。
生成 CA 证书(下面使用 OpenSSL,也可以使用 strongSwan 自带的 pki 命令)
root@ubuntu:~# openssl genrsa -des3 -out cakey.pem -passout pass:
root@ubuntu:~# openssl req -sha1 -days -new -key cakey.pem -out cacertreq.pem -passin pass: -subj "/C=CN/ST=HZ/O=VPN/CN=strongSwan CA"
root@ubuntu:~# mkdir -p demoCA/newcerts # 创建 CA 目录
root@ubuntu:~# touch demoCA/index.txt
root@ubuntu:~# echo > demoCA/serial
root@ubuntu:~# openssl ca -batch -selfsign -extensions v3_ca -days -in cacertreq.pem -keyfile cakey.pem -passin pass: -out ca.cer
临时修改 OpenSSL 配置文件
root@ubuntu:~# cp /etc/ssl/openssl.cnf ./
修改文件 openssl.cnf:
[ v3_ca ]
authorityKeyIdentifier = keyid,issuer
extendedKeyUsage = serverAuth
之所以这样(加上红色这一行),是因为 Windows 7 要求对端服务器证书具有【服务器身份验证】扩展属性,见下图
生成服务器证书
root@ubuntu:~# openssl genrsa -des3 -out serverkey.pem -passout pass:
root@ubuntu:~# openssl req -sha1 -new -key serverkey.pem -out servercertreq.pem -passin pass: -subj "/C=CN/ST=HZ/O=VPN/CN=server.vpn.cn"
root@ubuntu:~# openssl ca -batch -config ./openssl.cnf -extensions v3_ca -days -in servercertreq.pem -cert ca.cer -keyfile cakey.pem -passin pass: -out server.cer
安装 CA 及服务器证书到 strongSwan
root@ubuntu:~# cp ca.cer /usr/local/etc/ipsec.d/cacerts/
root@ubuntu:~# cp server.cer /usr/local/etc/ipsec.d/certs/
root@ubuntu:~# cp serverkey.pem /usr/local/etc/ipsec.d/private/
配置 strongSwan
root@ubuntu:~# cat /usr/local/etc/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file # basic configuration
config setup
charondebug="cfg 4, chd 4, dmn 4, enc 4, ike 4, job 4, knl 4, lib 4, mgr 4, net 4"
charonstart=yes
plutostart=no # Add connections here.
conn linux-vs-win7
authby=pubkey
left=%defaultroute
right=%any
keyexchange=ikev2
compress=no
auto=add
pfs=no
leftauth=pubkey
rightauth=pubkey
rightid=%any
leftsubnet=1.2.3.0/
leftsourceip=1.2.3.123
rightsourceip=1.2.3.0/
leftcert=server.cer
leftfirewall=yes root@ubuntu:~# cat /usr/local/etc/ipsec.secrets
: RSA serverkey.pem ""
生成客户端证书并打包成 PKCS12 格式
root@ubuntu:~# openssl genrsa -des3 -out clientkey.pem -passout pass:
root@ubuntu:~# openssl req -sha1 -new -key clientkey.pem -out clientcertreq.pem -passin pass: -subj "/C=CN/ST=HZ/O=VPN/CN=VPN Client"
root@ubuntu:~# openssl ca -batch -days -in clientcertreq.pem -cert ca.cer -keyfile cakey.pem -passin pass: -out client.cer
root@ubuntu:~# openssl pkcs12 -export -passin pass: -passout pass: -in client.cer -inkey clientkey.pem -out client.p12
将 PKCS12 及 CA 证书复制到 Windows 7 并安装到计算机帐户,点击【开始菜单】->【运行】->【mmc】,按下图所示,添加证书管理单元
导入客户端及 CA 证书
新建 VPN 连接
配置 VPN 连接属性:IKEv2 接入 VPN 网关
配置本地 DNS,在文件 c:\windows\system32\drivers\etc\hosts 最后一行加上
192.168.203.129 server.vpn.cn
配置结束,启动连接
root@ubuntu:~# ipsec start --nofork
Windows 7 下双击新建的 VPN 连接
下面是成功后的连接状态(已经获得服务器端分配的 IP 地址
连接过程中,Linux 命令行将输出一连串调试信息,这些信息在后面的计算验证中将用到
Python 环境准备
下载 Python 密码库 PyCrypto 的最新版本文件 pycrypto-2.6.1.tar.gz,解压到 C:\Python27\Lib
C:\Python27\Lib\pycrypto-2.6.1>python setup.py install
说明:安装过程中需要 Visual Studio 环境,用于编译源文件
安全协议系列(五)---- IKE 与 IPSec(上)的更多相关文章
- Netty4.x中文教程系列(五)编解码器Codec
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...
- bt协议详解 DHT篇(上)
bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...
- VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN的区别
最近软矿频繁地介绍了各种VPN,有免费的PacketiX.NET和Hotspot Shield,有付费的Astrill VPN,iVPN和PureVPN.在介绍这些VPN的时候,常常会说到PPTP.L ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...
- JVM系列五:JVM监测&工具
JVM系列五:JVM监测&工具[整理中] http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...
- 协议系列之HTTP协议
什么是HTTP\HTTPS HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.HTTP协议用于从WWWserver传输超文本到本地浏览器的传输协议,它能使浏览 ...
- SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...
- VSTO之旅系列(五):创建Outlook解决方案
原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...
- java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析
java多线程系列(五)---synchronized ReentrantLock volatile Atomic 原理分析 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java ...
随机推荐
- CentOS 配置防火墙操作实例(启、停、开、闭端口):
CentOS 配置防火墙操作实例(启.停.开.闭端口): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service iptables status< ...
- mysql-5.7.9安装
版本:mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz(编译版本) 解压: tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.ta ...
- AndroidStudio NDK配置使用以及错误集合
Error:Execution failed for task ':app:transformNative_libsWithStripDebugSymbolForDebug'. > java.l ...
- svn-多个项目版本库和自动同步更新post-commit
由于项目测试需求,需要远程服务器上使用svn做版本控制. 需求: 1,项目test1,项目test2,各自独立版本库,各自独立用户权限,便于项目管理 2,同步提交,本地svn提交至版本库后,服务器上的 ...
- Python unittest appium
import unittest from appium import webdriver from appium.common.exceptions import NoSuchContextExcep ...
- 3个sprint的团队贡献分
第一次冲刺贡献分 成员名字 贡献分 101丘娟 23 108周诗琦 26 107杨晓霞 24 124陈程 27 第二次冲刺贡献分 成员名字 贡献分 101丘娟 23 108周诗琦 27 ...
- javascript中this指针
看完此片文章豁然开朗,非常感谢.javascript技术难点(三)之this.new.apply和call详解 下面说一说自己的理解: this指针总是指向调用他的对象,其实我更愿意理解为:this指 ...
- Discuz! X3搬家后UCenter出现UCenter info: MySQL Query Error解决方案
Discuz! X3 X2.5论坛搬家后 登录UCenter出现报错:UCenter info: MySQL Query ErrorSQL:SELECT value FROM [Table]vars ...
- Calculator(补)
MyGitHub 刚刚开始时确实是连题目都看不懂= =,从第二行的新建类开始,就不知题目所云.所以我的困难比很多同学都要 开始得早一些--从题目第二行开始. 准确的说,当我按照题目要求新建了一个sca ...
- db2命令
把远程的数据库信息加载到本地 第一步,catalog server端的node ,命令如下: db2 catalog tcpip node db2node remote hostname server ...