智能机器人(11):声音操作

声音操作主要涉及audio-common这个stack,包括:

audio_capture,记录从microphone记录音频并发布音频消息到/audio这个topic;audio_play,监听/audio并输出音频到speaker;audio_common_msgs,消息定义;sound_play,播放音频文件或者合成语音;最常用到audio_capture和audio_play这两个package。

1、硬件

1.1、验证声卡
$ cat /proc/asound/cards
0 [AudioPCI       ]: ENS1371 – Ensoniq AudioPCI
———————Ensoniq AudioPCI ENS1371 at 0x2080, irq 16
如果必要设置下默认的声卡序号:
$ asoundconf set-default-card 0

2、驱动

2.1、安装相应版本驱动
$ sudo apt-get install ros-hydro-audio-common
2.2、测试
验证gstreamer在ALSA下工作正常,可以采集音频、播放音频:
$ gst-launch-0.10 alsasrc ! audioconvert ! audioresample ! alsasink

3、测试

3.1、audio_capture:采集音频
$ roslaunch audio_capture capture.launch
这产生/audio这个topic,查看下数据:
$ rostopic hz /audio
如果要保存文件,是:
$ roslaunch audio_capture capture_to_file.launch
这个是mp3格式的,要用sox播放需要先转换成wav格式:
$ lame –decode out1.mp3 outwav1.wav
$ play outwav1.wav
如果要直接播放,需要下载解码器:
$ sudo apt-get install libsox-fmt-mp3
>>>这个通常是run在远程机器上。
3.2、audio_play:播放音频
$ roslaunch audio_play play.launch
这样是个应声虫,microphone接收到啥,speaker就播放啥。
>>>这个通常是run在本地机器上。
3.3、sound_play:播放声音
$ rosrun sound_play soundplay_node.py
注意这个node是必需要首先加载的,多出了/robotsound这个topic。
>>>这个通常是run在远程机器上。
3.4、然后直接播放需要合成的音频:
$ rosrun sound_play say.py “hello world”
或者播放音频文件:
$ rosrun sound_play play.py  /opt/ros/hydro/share/sound_play/sounds/say-beep.wav
要注意这个是全路径。
如果需要即时停止所有音频:
$ rosrun sound_play shutup.py
>>>这个通常是run在本地机器上。

4、源代码方式

这个部分是不必要的。如果需要,先卸载前述驱动包
$ sudo apt-get removeros-hydro-audio-common
安装最新代码
$ cd ~/catkin_ws/src
$ git clone https://github.com/ros-drivers/audio_common.git
$ rosdep install audio_common
#All required rosdeps installed successfully
$ cd ~/catkin_ws
$ catkin_make
如果出错:
$ sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
上面这个0.10是ubuntu12.04的默认版本,如果提示需要1.0:
sudo add-apt-repository ppa:gstreamer-developers/ppa
sudo apt-get update
sudo apt-get install gstreamer1.0*
此路不通ppa源不可用:
sudo apt-get install ubuntu-restricted-extras
这个市浩大的一堆,慢慢下。
catkin_make后要更新
$ source ~/catkin_ws/devel/setup.bash

5、建立声音接口

建立一个node,利用sound_play作为wrapper来控制声音。注意用node给robotsound这个topic发消息,而不是建立消息。
这里把这个node命名为yak_node,用来处理SoundClient()和sound_play。SoundClient要注意避免超载报错,其参数可以是wav的文件名或者要合成语音的文本。
需要把所有音频资料防止同一个路径下,而且注意只支持wav和ogg格式的音频。
用户的音频采用yak形式publishe到yak这个topic,而yak_node这个node同样是subscribe到yak这个topic。

#!/usr/bin/env python
import roslib; roslib.load_manifest(‘sound_yak’)
import rospy, os, sys
from sound_play.msg import SoundRequest
from sound_play.libsoundplay import SoundClient
from sound_yak.msg import yak_cmd

# directory with sound assets – change as needed
soundAssets = ‘/home/shiloh/devel/audio_assets/’
# duration of yak throttle
throttle = 3 # seconds

def sound_translator(data):
#segmentation fault if too many sound commands given in short period
print data
global allow_yak
if rospy.Time.now() <= allow_yak: # Throttles yak to avoid
print(“Sound throttled”)      # SoundClient segfault
return
# when to reallow yak
allow_yak = rospy.Time.now() + rospy.Duration.from_sec(throttle)
#process yak commands requires full path names for sound assets
if data.cmd == “wav”:
soundhandle.playWave(soundAssets + data.param)
if data.cmd == “say”:
soundhandle.say(data.param)

def yak_init():
rospy.init_node(‘yak_node’, anonymous = True)
global allow_yak
allow_yak = rospy.Time.now()
rospy.Subscriber(‘yak’, yak_cmd, sound_translator)
rospy.spin()

if __name__ == ‘__main__’:
soundhandle = SoundClient()
rospy.sleep(1)

yak_init()

6、launch脚本
示例launch文件:
<launch>
<node name=”soundplay_node” pkg=”sound_play” type=”soundplay_node.py”/>
</launch>

7、sox瑞士军刀

http://ymkimit.blogspot.com/2014/07/recording-sound-detecting-silence.html#!/2014/07/recording-sound-detecting-silence.html
http://sox.sourceforge.net/sox.html
http://linux.die.net/man/1/rec
http://bbs.chinaunix.net/thread-2005749-1-1.html
http://blog.csdn.net/lijin6249/article/details/51955206

set AUDIODRIVER=oss
rec  -t wav  -r 16000   -b 16  -c 1  aa.wav       silence 1 0.3 1%   1 0.3 1%
自适应记录语音
rec rec.wav  silence 1  0.5 1% 1 1.0 3%
rec   -t wav  -r 16000   -b 16  -c 1   rec.wav   silence 1 0.1 1%   1 2.0  3%  is OKAY
sox -d -e u-law –endian little -b 8 -c 1 -r 8000 -t ul bb.wav silence 1 0.3 1% 1 0.3 1%
-t ossdsp 输入音频源
-w 采样位深w16位b8位
-r 44100 采样频率
-c 2 声道2
/dev/dsp 输入
-t raw 生数据

>>>效果器
效果器主要是声音滤波、频率转换、和声、混响、移相、音量等功能,可以只用一个也可以联合使用。

重低音:
play file.wav bass -20
play file.wav bass +20
bass是给输出结果加上低音效果,-20是低限值,+20是高限值。值愈低,声音愈低,反之则值愈高,声音愈浑厚。

混频器:
play 1234567890.wav   mixer 0.3,0.5,0.8,0.6
mixer效果器,它通过混合或者减少音轨从而减少音轨数,或者通过复制音轨而增加音轨数。0.3是从输入声道的左边到输出声道左边的音量值,0.5是从输入声道的左边到输

出声道右边的音量值,0.8是从输入声道的右边到输出声道左边的音量值,0.6是从输入声道的右边到输出声道右边的音量值。不过对于单声道无效。

节拍器:
play 1234567890.wav  tempo -q 0.8 82 20  16
0.8设置新节拍相对于老节拍的比率,82设置所选算法要划分音频的片段大小,单位毫秒,20是音频长度,依靠它来搜索以寻找重叠点,16是重叠长度。

颤动器:
play 1234567890.wav  tremolo 3.5 60
3.5是颤音频率,单位是赫兹Hz,60是深度百分比,具体来说就是”颤”到多长或深。

回响器:
play 1234567890.wav    echo 0.8 0.88 60 0.4
听起来就象用两个乐器演奏同一个样本一样,0.8是输入音量,0.88是输出音量,60是延迟单位是毫秒,0.4是相对于输入音量的衰减值。
如果延迟时间变长,听起来更象在山顶上的露天演唱会。假如延迟很短,听起来象(金属的)机器人的表演。回响可以多个,echo 0.8 0.9 1000 0.3 1800 0.25;这种回响分对称回声和不对称回声。

和声器:
play 1234567890.wav    chorus 0.7 0.9 55 0.4 0.25 2 -t
55是延迟,0.4是衰减,0.25是调制速度,单位Hz,2是调制深度,典型的延迟在40毫秒(40ms)到60毫秒(60ms),调制速度最好在0.25Hz附近,调制深度2毫秒左右(2ms)。-t使用三

角函数调制,上面的延迟时间有点短,输出有点过载。
play 1234567890.wav    chorus 0.6 0.9 50 0.4 0.25 2 -t 60 0.32  0.4  1.3 -s
-s,表示正弦波调制。
play 1234567890.wav    chorus 0.5 0.9 50 0.4 0.25 2 -t 60 0.32 0.4 2.3 -t 40 0.3 0.3 1.3 -s
这采用了三部和声

缩展器:
让它在低音部分不要那样小声,而在高音部分不要那样刺耳,允许信号动态地压缩或扩展。
play 1234567890.wav    compand 0.3,1 6:-70,-60,-20 -5 -90 0.2 0.3是起音时间(指的是生因忽然变大的时间),1是衰减时间,起 音时间应该比衰减时间短,因为我们的耳朵对忽然变大的声音比对忽然柔和哦的声音更敏感。6:-70是缩展器转换函数表,单位是dB,它跟音频信号的最大幅值有关联,它的意思是很柔软的声音(-70dB以下)仍然保留不变,这将防止缩展器在在乐章转换时从静默忽然飙升音量。但是在-60dB到0dB(最大音量)的声音将被提高,原始音频60dB的动态范围将被压缩成20dB,这样频宽足以享受音乐同时有可以不受路上噪音的影响。这就是-60和-20的意思。-5是额外增益,用来避免削波,-90表示初始化音量从几乎静默开始,这样对于削波现象将有很好的抑制作用。0.2秒是的延迟使得缩展器对于声音的忽然升高有很好的抑制作用。

取得戏剧性效果:
1、将回放速率改为原先的2倍,这个是参数越大速度越慢:
play 1234567890.wav    stretch 0.5
2、改变回放调子和节拍,这个语速越快越逗:
play 1234567890.wav    speed 2
3、升高样本1个短调(100音分),这个声调正的越高越儿童脆否则越老人:
play 1234567890.wav    pitch 100

play 1234567890.wav    pitch 300  speed 2  stretch 0.5

余响器:
play 1234567890.wav    reverb 1 100 100
1是输出音量,600是余响时间,180是延迟时间,延迟时间最好是余响时间的1/4到1/2。只考虑了一面墙的情形,如果还要考虑在多加一面墙,为 reverb 1 600  180 200,依次累加。

pitch 300  speed 2  stretch 2 echo 1 1 100 0.2
pitch 300  speed 1.5  stretch 1 echo 1 1 100 0.2
./web2.sh  –voice_name=xiaorong  “pitch 100  speed 1  stretch 1  echo 1 1 20 0.4”

智能机器人(09):后台系统配置

一、安装 Apache2

$ sudo apt-get install apache2
安装PHP模块:
$ sudo apt-get install php5
安装Mysql:
$ sudo apt-get install mysql-server
其他模块安装:
$ sudo apt-get install libapache2-mod-php5
$ sudo apt-get install libapache2-mod-auth-mysql
$ sudo apt-get install php5-mysql
$ sudo apt-get install php5-gd
或者一揽子:
$ apt-get install php5 libapache2-mod-php5 php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl

二、apache2控制

2.1 此方式安装的启动脚本是 /usr/bin/apache2ctl:
启动:sudo apache2ctl -k start
停止:sudo apache2ctl -k stop
重启:sudo apache2ctl -k restart
2.2 或者用产生的启动和停止文件是:/etc/init.d/apache2:
$ sudo /etc/init.d/apache2 force-reload
$ sudo /etc/init.d/apache2 restart
2.3 或者:
$ sudo service apache2 reload
$ sudo service apache2 restart

三、apache配置

apache2的默认的http配置位于:
/etc/apache2/sites-enabled/00default
在开启了https的ssl模块后需要修改的是
/etc/apache2/sites-enabled/default-ssl.conf

四、 常见错误

4.1 当apache2重启时提示:
* Starting web server apache2
apache2:Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
此时检查配置文件:
$ sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive globally to suppress this message
解决方法是:
$ sudo vim /etc/apache2/apache2.conf
文件顶端加入:
ServerName 127.0.0.1
或者,
ServerName localhost
再检查:
$ sudo apache2ctl configtest
Syntax OK
然后重启服务:
$ pidof apache2
$ sudo kill -9 $ sudo service apache2 reload
$ sudo service apache2 restart

六、PHP模块

Ubuntu有点特殊,在/etc/apache2/apache2.conf文件通过包含其他配置文件涵盖了所有的apache2系统配置信息。
一种方法就是将两个文件链接到mods-enabled目录下:
$ sudo ln -s /etc/apache2/mods-available/php5.load /etc/apache2/mods-enabled/php5.load
$ sudo ln -s /etc/apache2/mods-available/php5.conf /etc/apache2/mods-enabled/php5.conf
然后重启apache即可。

智能机器人(07):安全证书配置

一、启用 ssl
二、获得证书
三、自建证书
四、服务器的证书部署
五、客户端的证书设置
十、在做一份

对于传输密码或私密信息的http明文没有可靠性可言,需要https,为此需要制作ssl证书。

商业的权威机构用ca来证明某个.crt公钥属于特定组织或个人。.crt证书网站部署的证书文件。.key的私钥可以解密用.crt公钥加密后的信息(小心保管)。而.csr包含了.crt的公钥信息,供网站向CA发起认证请求,中间文件。

一、启用 ssl

$ sudo a2enmod ssl
这条命令相当于做软链接:
$ sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled
$ sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled
对应的停用是:
$ sudo a2dismod ssl

二、获得证书

这个有自签名的和商业购买的两种方式。 大多数浏览器会对自签署的证书报警,可以从价格比较便宜的Comodo购买, 为了购买先产生自己的私钥和请求文件:
$ openssl req -new -newkey rsa:2048 -nodes -keyout mykey.key -out mycsr.csr
然后发送给 Comodo 购买证书:
Root CA Certificate – AddTrustExternalCARoot.crt
Intermediate CA Certificate – COMODORSAAddTrustCA.crt
Intermediate CA Certificate – COMODORSADomainValidationSecureServerCA.crt
Your PositiveSSL Certificate – mycrt.crt

三、自建证书

3.1 创建CA签名
$ sudo openssl genrsa -des3 -out zdh2.key 1024
如果不使用密码去除-des3选项
3.2、创建CSR
$ sudo openssl req -new -key zdh2.key -out zdh2.csr
3.3、自己签发证书
$ sudo openssl x509 -req -days 3650 -in zdh2.csr -signkey zdh2.key -out zdh2.crt
3.4、或者一步完成:
$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/apache2/ssl/zdh2.key -out /etc/apache2/ssl/zdh2.crt
上面的: openssl,命令行工具;req,证书类型;-x509,需要生成自签名证书文件,而不是证书请求文件;-nodes,不需要密码保护.key文件,否则每次apache都会提示输入密码;
-days 3650,证书有效期;-newkey rsa:2048: 同时生成rsa私钥和证书;-keyout,命名私钥文件;-out,命名证书文件。

四、服务器的证书部署

4.1、复制到某个目录
$ sudo mkdir /etc/apache2/ssl
$ sudo cp zdh.crt /etc/apache2/ssl …..
4.2、修改配置文件
以上步骤后/etc/apache2/sites-available/目录下会在/etc/apache2/sites-enabled/下有软链接,修改它:
$ sudo vim ……sites-enabled/default-ssl.conf
在段中保证以下内容:
SSLEngine On
SSLOptions +StrictRequire ???
SSLCertificateFile /etc/ssl/certs/zdh.crt
SSLCertificateKeyFile /etc/ssl/private/zdh.key
4.3、监听端口
检查/etc/apache2/ports.conf文件中443>(ssl的端口)
已经监听:
Listen 443
4.4、此时启动apache会提示输密码,如果不想的话在httpd.conf修改IfModule ssl_module 配置:
“SSLPassPhraseDialog exec:/home/admin/xxx/conf/apache_pass.sh”
而 apache_pass.sh 内容就是显示密码:
#!/bin/sh
echo “password”

4.5、测试部署
在客户机从浏览器访问:
https://serverIP
浏览器可能报警证书问题。需要通过下面步骤对客户机的证书做设置。

五、客户端的证书设置

7.1 Chrome
Q: 如果browser是google的chrome的话,会报错“Failed to get access to local media. Error code was Permission Denied”
因为,chrome needs https to use get user media,Updated to secure http and everything works fine.
由于,Starting with Chrome 47, getUserMedia() requests only allowed from secure HTTPS or localhost, so need to setup a self signed ssl certificate for webserver and and access with https://722.20.10.11:8080
所以,如果使用chrome浏览器的话,可以部署自签署证书采用ssl实现https。
如果一定要选择http实现webrtc的话,那就用firefox浏览器不要用chrome。

Q: how to always accept webRTC webcam request in chrome?
if command line:
$ google-chrome “http://localhost” –use-fake-ui-for-media-stream
which avoids the need to grant camera/microphone permissions.
or, on Chrome:
chrome://settings/content#media-stream-mic

APP: List of Chromium Command Line Switches
http://peter.sh/experiments/chromium-command-line-switches/

7.2 Firefox
Q: how to always accept webRTC webcam request in firefox?
Go in url about:config
Search media.navigator.permission.disabled
dbClick or set value to true

7.3 Setup ssl https connection
As mentioned earlier, apps running on Chrome browsers can’t access local cameras and microphones unless the application is hosted from localhost or an SSL server (https).
When you are doing development, it is simplest to get node.js to handle the SSL. Benefits of using SSL:
* Increase end user confidence
* Secure signaling traffic from eavesdroppers
* In Chrome: Browser remembers camera and microphone sharing preference for site. Does not re-ask at each – visit.
* In Chrome: Enables screen sharing API
Before applying, you will need to generate a CSR (Certificate Signing Request). The most common software used for generating CSR’s and handling SSL is OpenSSL,
There are many operating system specific guides available for how to use SSL on your server Self signed certificates are a free method of creating a certificate suitable for development. A warning will occur when browsing your site.
http://www.selfsignedcertificate.com/ <— from thi st ogenerate or, You can create a key and certificate yourself instead of downloading them from this page. This makes your key more secure. To generate a key: $ openssl genrsa -out 172.20.10.3.key 2048 And the certificate: $ openssl req -new -x509 -key 172.20.10.3.key -out 172.20.10.3.cert -days 3650 -subj /CN=172.20.10.3 or, to buy one http://bit.ly/i95aUS 如果是商业购买的,证书链可靠,浏览器不需要设置。 如果是自签名的,需要导入或下载证书,各个浏览器不同。 5.1、Firefox 这个在访问https://serverIP时, 会提示网站不可信任。 那么添加例外就可以: exception->confirm security exception https://serverIP ok,就可以通过ip地址访问。 5.2、Chrome 这个访问https://IP-address,浏览器: Your connection is not private Attackers might be trying to steal your information from 116.50.77.22 (for example, passwords, messages or credit cards). NET::ERR_CERT_COMMON_NAME_INVALID 具体的: This server could not prove that it is 116.50.77.22; its security certificate is not trusted by your computer’s operating system. This may be caused by a misconfiguration or an attacker intercepting your connection. Proceed to 116.50.77.22 (unsafe) 所以,同样需要添加证书: edit->preference->advanced setting->https/ssl->authorities->import->ok. 但是, Chrome非常憎恨自签署证书Why does Chrome hate self-signed certificates so much。 浏览器依然不能像http那样通过IP地址访问服务器,对于https://serverIP这种方式依然报警: Server’s certificate does not match the URL 所以,需要根据证书里Issued to的域名信息修改: $ vi /etc/hosts 10.10.0.1 dehaou14-n501jw $ ping dehaou14-n501jw ok https://dehaou14-n501jw/ ok

十、在做一份

对于webRTC的nodejs使用8080端口的音视频聊天服务,重复上述步骤,生成zdh2_rtc.crt和zdh2_rtc.key,重复上述步骤部署。

智能机器人(05):虚拟网络配置

一、需求
二、证书体系
三、模块安装
四、一些准备
六、—CA证书制作
七、—Server证书制作
八、—Client证书制作
九、—Server端典型配置
十、—Client端典型配置

  • 一、需求

机器人走出去之后,连接的可能是商场的无线wifi,也可能是厂区的无线热点,这些都是局域网,凡是属于下三个subnet的地址都是局域网,公网寻不到:
10.0.0.0 10.255.255.255 (10/8 prefix)
172.16.0.0 172.31.255.255 (172.16/12 prefix)
192.168.0.0 192.168.255.255 (192.168/16 prefix)
那么如何从茫茫机海中定位机器。为了实现目的需要在局域网上再假设一层专有网络。

1.1、例如场景:
1、服务器srv1处于香港某位置;
2、机器人rbt、rbt2…处于某个超市局域网内,ip地址是172.16.1.111,172.16.1.111…;
3、管理后台pc1、pc2…位于某个科技公司局域网内,ip地址192.168.1.66和192.168.1.88…;
4、那么此时通过srv1新建一虚拟网络VPN,使得rbt1、rbt2、pc1、pc2的虚拟网络为10.8.1.100/ 111/ 122/ 133,这样这台机器就位于同一网络了,不管物理空间上位于何处都可以通过node访问rostopic,或者ssh等常规管理。

1.2、服务器的配置文件为:客户机的配置文件为:
rbt1和rbt2上要合适配置/etc/hosts,并运行roscore。
pc1和pc2上要合适配置/etc/hosts,并export ROS_MASTER_URI=http://rbt:11311。
完成后可以测试:
$ rosnode ping /somenode

  • 二、证书体系

openVPN提供了多种身份验证方式,包括:预享私钥,第三方证书,用户名/密码组合。
openVPN大量使用openSSL加密库中的SSLv3/TLSv1协议函数库,例如x509。
x509证书链一般用到三类文件,key,csr,crt:
key是私用密钥,openssl格式,通常是rsa算法,爱咋用咋用。
csr是证书请求文件,用于申请证书。在申请的时候必须使用自己的私钥来签署申请,还可以设定密钥。
crt是证书文件是签署人用自己的key签署的凭证。通常签名证书时候需要一个序列号避免两个证书重复。

2.1、具体到本应用证书包括:
ca证书,服务器的Server证书,客户机的Client证书。

2.3、各文件的用途
文件名———-位置———-目的———–私密性
ca.crt—–server + all clients—–Root CA certificate—–NO
ca.key—-key signing machine only—–Root CA key—–yes

ta.key—–server + all clients—-antin DDOS—–yes
dh{nnn}.pem—-server only—–Diffie Hellman parameters—–NO

server1.crt—-server only—–Server Certificate—–NO
server1.key—–server only—–Server Key—–yes

client1.crt—–client1 only—–Client1 Certificate—–NO
client1.key—–client1 only—–Client1 Key—–yes

client2.crt—–client2 only—–Client2 Certificate—–NO
client2.key—–client2 only—–Client2 Key—–yes

… …

  • 三、模块安装

3.1、vpn安装
$ sudo apt-get install openvpn
3.2、easy-rsa安装
$ sudo apt-get install easy-rsa

  • 四、一些准备

通过easy-rsa制作三个证书。
首先单纯是为了方便考虑,在/etc/openvpn/目录下创建easy-rsa文件夹
$ sudo mkdir /etc/openvpn/easy-rsa/
然后把/usr/share/easy-rsa/目录下的所有文件全部复制到/etc/openvpn/easy-rsa/下
$ sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
当然也可以直接在/usr/share/easy-rsa/下制作证书,为了管理证书把easy-rsa放在openvpn下。

  • 六、—CA证书制作

6.1、编辑vars文件,设置证书组织信息:
$ sudo vi /etc/openvpn/easy-rsa/vars
export KEY_COUNTRY=”CN”
export KEY_PROVINCE=”ZJ”
export KEY_CITY=”HZ”
export KEY_ORG=”HDhello”
export KEY_EMAIL=”HD@most.in”
export KEY_OU=”WestLake”
export KEY_NAME=”Server1”
!!! 其中export KEY_NAME=”Server1”这个要记住统一,制作Server端证书时用到。
6.2、切换到root用户:
$ sudo su
使其生效:
$ source vars
执行clean-all删除当前目录下的keys文件夹:
$ ./clean-all
6.3、制作CA证书:
./build-ca
6.4、常见错误
如果:
140224783447712:error:0E065068:configuration file routines:STR_COPY:variable has no value:conf_def.c:618:line 198
line 198 of openssl-1.0.0.cnf reads:
subjectAltName=$ENV::KEY_ALTNAMES
这是因为 vars文件里面缺少一行, 在vars文件最后添加这一行:
export KEY_ALTNAMES=”something”
尽管这不是原本vars文件中有的但是还是把它加到文件的尾部,负责不能避免build-ca脚本失败。

这样查看keys目录看到已经生成ca.crt和ca.key两个文件,如此CA证书制作完成。
为了方便把该CA证书ca.crt文件复制到openvpn的启动目录/etc/openvpn下
$ cp keys/ca.crt /etc/openvpn/

  • 七、—Server证书制作

$ ./build-key-server Server1
!!!!! 注意上述 Server1,就是前面vars文件中设置的KEY_NAME。
这样可以查看生成的Server证书, 已经生成 Server1.crt、Server1.key和Server1.csr三个文件。

再为服务器生成加密交换时需要的Diffie-Hellman文件
$ ./build-dh
可以查看生成的文件,已经生成了dh2048.pem这个文件

再生成防止DDoS攻击的ta.key
$ openvpn –genkey –secret keys/ta.key

然后把 Server1.crt、Server1.key、dh2048.pem、ta.key复制到/etc/openvpn/目录下
$ cp keys/Server1.crt keys/Server1.key keys/dh2048.pem keys/ta.key /etc/openvpn/

  • 八、—Client证书制作

$ ./build-key Client001
!!!!! 注意上述 Client001是客户端的名称,这个可以自己定义。
这样可以看出已经生成 Client001.csr、Client001.crt和 Client001.key这个三个文件。
根据需要部署的客户机的数量,可以继续添加:
$ ./build-key Client002
… …
NOTE:
next time after several days i fu want to re-build some client files rember to sudo su first.

  • 九、—Server端典型配置

首先从openvpn自带默认模版复制Server端所需的配置文件:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ cd /etc/openvpn/
$ gzip -d server.conf.gz
!!! 注意在修改server.conf文件时候需要绝对路径
$ vi server.conf

port 22105 —指定端口号
proto tcp —指定协议
dev tun —指定非briage

ca ca.crt
cert Server1.crt
key Server1.key
dh dh2048.pem

tls-auth ta.key 0 # This file is secret

server 10.10.0.0 255.255.248.0 —The server will take 10.10.0.1 for itself, the rest will be made available to clients
ifconfig-pool-persist ipp.txt —Maintain a record of client virtual IP address associations in this file.

cipher BF-CBC # Blowfish (default)
auth SHA512 —Message Authentication
comp-lzo —Message Authentication
push “route 10.10.0.0 255.255.248.0”
persist-key
persist-tun
tun-mtu 1500
tun-mtu-extra 32

然后可以开启openvpn服务:
$ /etc/init.d/openvpn start
$ netstat
$ netstat -tunlp | grep 22105
可以看出openvpn已经在此启动,而且确实使用TCP协议22105端口而非默认的1194。

  • 十、—Client端典型配置

客户端所需的证书包括CA证书和Client证书。需要网络下载或者USB拷贝到客户机上。注意各个文件的权限。
CA证书主要使用crt结尾的文件,Client证书主要使用crt和key结尾的两个文件:
$ cp /media/ClientPC/UUI/ca.crt Client001.crt Client001.key /home/ClientPC/myvpn
修改以上几个文件的用户属性
$ chown dehaou1404:dehaou1404 ca.crt
$ chown dehaou1404:dehaou1404 Client001.*
把几个私钥文件降低权限:
$ chmod 600 ta.key Client001.key

然后使用openvpn默认的模板制作Client端配置文件:
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /home/dehaou1404/myvpn
$ chown dehaou1404:dehaou1404 client.conf
$ nano client.conf

client —指定当前VPN是客户端
dev tun —指定非briage
proto tcp —与服务器端的保持一致

remote 192.168.1.3 22105 —指定远程服务器的实际public IP地址 和端口号
ca ca.crt
cert Client001.crt
key Client001.key
tls-client —使用TLS加密传输,server端为Server,client端为tls-client
tls-auth ta.key 1 —和Server配置一致 注意最后参数是1
#如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;未设置则注释掉这一行;

# Server使用build-key-server脚本什成的,在x509 v3扩展中加入了ns-cert-type选项
# 防止VPN client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPNServer
ns-cert-type server
# 指定采用服务器校验方式 注意easy-rsa的默认脚本中是没有ns-cert-type server的设定,
# *千万不要*在配置中加上这个设定。否则会导致TLS handshark failed。

persist-key —通过keepalive检测超时后重新启动VPN,不重新读取keys保留第一次使用的keys
persist-tun —通过keepalive检测超时后重新启动VPN,一直保持tun或者tap设备是linkup的

comp-lzo —与服务器保持一致 对数据进行压缩,
auth SHA512 —指对于数据通道的加密方法。
cipher BF-CBC —在交换密钥时用到的加密方法,真正影响传输性能。根据速度选择合适加密算法,
# 在服务器和客户端openvpn配置中用cipher BF-CBC或cipher AES-128-CBC指明,服务器+客户配置都更改。

tun-mtu 1500 —为了兼容,1500依然是诸多以太网卡的默认MTU设置,
# 但是厂商对如今1G/10G等高端网卡以及超五类/六类双绞线以及光纤的高大上特性又不能视而不见
tun-mtu-extra 32 —openvpn如果使用TCP协议,MTU一般不用修改;如果是用UDP协议,可以设置tun-mtu 1450会改善网络.
! mssfix 1450
ping-restart 60 —设置成120秒,尽可能和ping拉开距离,
# 这两个参数保证不会因为ping-restart导致断开,这样就将问题全部集中在控制通道了
ping 10 —设置为5秒,尽可能短,但不要太短

然后客户机可以加入虚拟网:
$ sudo openvpn –config client.conf
如果开机启动后台运行的话把命令写入/etc/rc.local文件中, 添加到语句:exit 0 前面:
/usr/sbin/openvpn –config /home/ClientPC/myvpn/client.ovpn > /dev/null &
注意:&符号不能省略避免阻塞系统启动。
***注意***:证书文件如果没有存放在/etc/openvpn/目录下,在.conf文件中要填写该文件的绝对位置路径。

  • 附、参考高级配置

https://help.ubuntu.com/lts/serverguide/openvpn.html
http://answers.ros.org/question/11045/how-to-set-up-vpn-between-ros-machines/

https://github.com/Nishida-Lab/TC2015/wiki/OpenVPN_ROS_client
http://www.lxway.com/4442182692.htm