首页
社区
课程
招聘
[翻译](Ubuntu文档)OpenSSL
发表于: 2012-10-7 23:12 12145

[翻译](Ubuntu文档)OpenSSL

2012-10-7 23:12
12145

本文档用于介绍SSL应用层协议,特别是OpenSSL对SSL的实现。举例详细介绍了在Client-Server环境下OpenSSL的使用。最后,通过例子展示了如何在Apache上使用OpenSSL以提供Https服务。

读者应熟练使用命令行,bash,修改配置文件。

OpenSSL简介:
SSL也即Secure Socket Layer,是由网景公司为了传输敏感数据而提出的协议。SSL使用私钥加密传输的数据,防止被窃听。SSL最普遍的使用适合和浏览器结合使用,但是其他很多的应用也可以使用SSL。一般而言,使用了SSL的URL以https开头。

OpenSSL是广泛使用的商业级SSL工具,由Eric A. Young和Tim J.Hudson开发的库SSLeay。

X.509是ITU-T发布的数字证书规范。它规定了确定个人或计算机系统身份确认所需的信息和属性,用于安全管理和发布英特网的数字签名证书。OpenSSL广泛应用X.509。

OpenSSL使用

安装:首先使用如下命令确定Ubuntu可用的SSL版本:
apt-cache search libssl | grep SSL

应该看到如下结果:
libssl0.9.6 - SSL shared libraries (old version)
libssl-dev - SSL development libraries, header files and documentation
libssl0.9.7 - SSL shared libraries

可能还需要安装ca-certificate.
若需要OpenSSL的通用库,还需安装libssl-dev.

基本OpenSSL命令
确定OpenSSL的版本: openssl verion
OpenSSL的可用命令: openssl help
为查找某一命令的帮助,在命令后加-h,如 openssl enc -h
列出所有可用的加密算法: openssl ciphers -v
使用openssl speed可以查看本机的openssl速度,查看每个算法美妙的加密字节数,以及sign/verify的时间

SSL证书
该部分介绍SSL证书的产生,包括用于支持SSL的服务应用的自签名和公认签名,以及用于客户程序的X.509签名。
服务器SSL证书
生成X.509证书后,有三种方式进行签名:自签名,生成CA以及由公认的CA机构签名。证书签名后,便可用于OpenSSL、连接LDAP的SSL通道以及HTTP服务器。该部分用于介绍证书的生成和签名。

生成并自签名证书
自签名证书的好处是使用方便,按需生成。当然,仅适用于封闭式的测试用途。使用自签名证书的缺点是用户的浏览器或应用,在连接使用自签名的HTTP服务器时总会报警。浏览器如firefox在默认情况下对公认可信的CA不会报警,但是在导入服务器的根证书后,也可以抑制警告。但一般而言,自签名的证书不推荐用于公共应用。(若要用于e-commerce,公认签名证书不可少哦。)

在安装了OpenSSL之后,生成X.509证书就非常简单了。对于自签名证书,首先必须建立CA:
1. 创建初始工作环境,譬如在home目录,
cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
创建并进入myCA,同时生成两个子目录 signedcerts和private
myCA用于存放CA证书,证书数据库,生成的证书,密钥以及请求
signedcerts:保存签名证书的copy
private: 包含私钥

2. 在myCA中创建证书库:
echo '01'>serial && touh index.txt
然后创建caconfig.cnf文件。sudo nano ~/myCA/caconfig.cnf 内容如下:

# My sample caconfig.cnf file.
#
# Default configuration to use when one is not provided on the command line.
#
[ ca ]
default_ca      = local_ca
#
#
# Default location of directories and files needed to generate certificates.
#
[ local_ca ]
dir             = /home/<username>/myCA
certificate     = $dir/cacert.pem
database        = $dir/index.txt
new_certs_dir   = $dir/signedcerts
private_key     = $dir/private/cakey.pem
serial          = $dir/serial
#      
#
# Default expiration and encryption policies for certificates.
#
default_crl_days        = 365
default_days            = 1825
default_md              = md5
#      
policy          = local_ca_policy
x509_extensions = local_ca_extensions
#      
#
# Default policy to use when generating server certificates.  The following
# fields must be defined in the server certificate.
#
[ local_ca_policy ]
commonName              = supplied
stateOrProvinceName     = supplied
countryName             = supplied
emailAddress            = supplied
organizationName        = supplied
organizationalUnitName  = supplied
#      
#
# x509 extensions to use when generating server certificates.
#
[ local_ca_extensions ]
subjectAltName          = DNS:alt.tradeshowhell.com
basicConstraints        = CA:false
nsCertType              = server
#      
#
# The default root certificate generation policy.
#
[ req ]
default_bits    = 2048
default_keyfile = /home/<username>/myCA/private/cakey.pem
default_md      = md5
#      
prompt                  = no
distinguished_name      = root_ca_distinguished_name
x509_extensions         = root_ca_extensions
#
#
# Root Certificate Authority distinguished name.  Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName              = MyOwn Root Certificate Authority
stateOrProvinceName     = NC
countryName             = US
emailAddress            = root@tradeshowhell.com
organizationName        = Trade Show Hell
organizationalUnitName  = IT Department
#      
[ root_ca_extensions ]
basicConstraints        = CA:true

注意将/home/<username>/改成相应的内容;以及【root_ca_distinguished_name】的内容。

3. 生成CA 根证书和密钥,export OPENSSL_CONF=~/myCA/caconfig.cnf,该命令用于给环境变量OPENSSL_CONF赋值为caconfig.cnf。
然后,生成CA证书和密钥
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
该命令需要用户输入密钥。千万不要忘记了!每次生成并签名服务器或者用户证书的时候都需要这个密码!
以上步骤生成了自签名的证书,和RSA公/私密钥对。证书的格式是PEM,有效期是1825天。
/myCA/cacert.pem: CA公开证书
/myCA/private/cakey.pem:CA私钥


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 6
支持
分享
最新回复 (4)
雪    币: 68
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
续:

创建自签名服务器证书:
配置CA后,便可以对证书进行自签名。首先,你可能希望用密码短语加密证书的私钥。加密后,即使证书失窃,也可以有效保护。
使用SSL的应用启动后,必须要输入密码短语后才能使用证书。问题是,如果该服务处于无人监管的情况下,譬如当电脑重启,如果没人输入密码短语,那么web server无法使用。折中方法是:私钥可以被解密,这样服务可以自动启动。

实际生成自签名的证书,使用以下步骤:
生成服务器配置文件~/myCA/exampleserver.cnf,例子如下:
#
# exampleserver.cnf
#

[ req ]
prompt                  = no
distinguished_name      = server_distinguished_name

[ server_distinguished_name ]
commonName              = tradeshowhell.com
stateOrProvinceName     = NC
countryName             = US
emailAddress            = root@tradeshowhell.com
organizationName        = My Organization Name
organizationalUnitName  = Subunit of My Large Organization

注意修改server_disgtinguished_name,common name必须和host name匹配,那么host/certificate不匹配,客户端程序会出错。

配置文件准备好之后,使用如下命令生成服务器证书:
export OPENSSL_CONF =~/myCA/exampleserver.cnf
该命令设置环境变量OPENSSL_CONF,使得openssl更换配置文件。
然后生成证书和密钥:
openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
同样的,需要输入密码短语。
然后,需要将临时私钥转换为unencrypted key。命令如下:
openssl rsa < tempkey.pem > server_key.pem
需要输入密码短语。
如果希望将key保持为加密状态,直接改名,
mv tempkey.pem server_key.pem。

现在,需要使用CA key对服务器证书签名:
export OPENSSL_CONF=~/myCA/caconfig.cnf
openssl ca -in tempreq.pem -out server_crt.pem
删除临时证书和密码文件。
rm -f tempkey.pem && rm -f tempreq.pem
现在,自签名的服务应用证书和密钥对便产生了:
1. server_crt.pem : 服务应用证书文件
2. server_key.pem : 服务应用密钥文件

阅读应用文档,了解如何在应用中使用证书和密钥。譬如,Configuring Apache for SSL Support.
2012-10-8 13:17
0
雪    币: 68
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
续:

X.509证书转换用户版本PKCS#12

如果需要从服务器的根CA X.509生成用户使用的PKCS#12,使用以下步骤:
下面命令生成包含证书和密钥对的文件:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
然后,下面的命令将该文件生成PKCS#12:
openssl pkcs12 -export -out mycert.pfx -in mycer.pem -name "Certificate for whatever"
会提示输入密码,可以不输。
生成的mycert.pfx文件可以被诸如浏览器、E-mail客户端的应用程序导入,因为这个证书代表了服务器的根CA 证书,所有由该CA证书前面的服务器级证书都会被安装了证书PKCS#12版本的客户应用接受。

生成由公认CA签名的证书
实际使用的譬如运行电子商务的服务器需要由公认的CA如verisign签名的证书。生成并获得CA的签名比较困难。得到签名之前有很多的paperwork,以确保信息的准确性。
如果不需要由密码短语加密的密钥,下面的命令生成私钥和证书请求:
openssl req -new -newkey rsa:1024 -nodes -keyout mykey.pem -out myreq.pem
若已有密钥,则使用以下命令:
openssl req -new -key mykey.pem -out myreq.pem
如果需要验证前面和证书请求中的信息,以下命令验证签名:
openssl req -in myreq.pem -noout -verify -key mykey.pem
信息验证使用如下命令:
openssl req -in myreq.pem -noout -text
其后的步骤一般是在CA申请表格中包含改证书请求的内容,然后等待证书。密钥文件需要好好保管,使用CA签名的证书时会需要它。

用户应用中使用证书
本部分介绍用户角度看如何在SSL链接中使用PKCS#12证书,并演示了在firefox浏览器以及e-mail客户端导入证书的过程。
在应用中导入root根证书,便可以建立与服务器的可信SSL加密的链接,而不会在乎这个证书哪里来的。
在Mozilla Firefox中导入证书:
1. Firefox Edit->preference
2. 点击Advanced
3. 点击View Certificate
4. 点击Import
5. 找到certificate文件所在位置,.pfx文件
6. 选中pfx文件,点击open
7. 可能提示输入firefox的主密码,或者当场生成一个;点击OK
8. 提示输入证书的输出密码,如果没有与证书相关的密码,点击OK;否则输入,点击OK
9. 出现成功信息;
10.点击OK
11. 成功地导入了PKCS#12证书。

在邮件客户端Evolution中导入证书:
1. Eolution点击Edit>preference;
2. 点击证书;
3. 点击import;
4. 找到pfx文件;
5. 选中,打开;
6. 可能提示输入Evolution的证书数据库密码,或者设置初始密码;点击OK
7. 提出输入PKCS12文件的密码,如果没有,点击OK。
8. 在Eolution窗口可以看到证书,以及证书的详细内容;
9. 点击关闭;
10. 成功导入。

在Mozilla雷鸟中导入证书:
1. Thunderbird, 点击Edit-Preference
2. 点击Advanced
3. 点击certificate
4. 点击manage certificates
5. 点击import
6. 找到pfx文件
7. 选中文件,点击open
8. 可能提示输入thunderbird的主密码,或者设置初始密码;点击OK
9. 输入证书的导出密码;点击OK。如果没有,点击OK。
10. 成功信息出现。
11. 点击OK。
12. 成功。

在系统CA数据库中导入证书
在系统可信CA数据库中导入证书后,所有使用该库的应用都能自动使用证书:
1. copy证书到系统证书目录,在terminal输入:
sudo cp mycert.pem /usr/share/ca/certificates/mycert.crt
2. 编辑ca-certificats配置文件/etc/ca-certificates.conf. 将刚才拷贝的文件名加在#之后的第一行,如:
# This file lists certificates that you wish to use or to ignore to be
# installed in /etc/ssl/certs.
# update-ca-certificates(8) will update /etc/ssl/certs by reading this file.
#
# This is autogenerated by dpkg-reconfigure ca-certificates.
# certificates shoule be installed under /usr/share/ca-certificates
# and files with extension '.crt' is recognized as available certs.
#
# line begins with # is comment.
# line begins with ! is certificate filename to be deselected.
#
mycert.crt
brasil.gov.br/brasil.gov.br.crt
cacert.org/cacert.org.crt
mozilla/ABAecom_=sub.__Am._Bankers_Assn.=_Root_CA.crt
[... many additional certificates omitted ...]
如果不手动,可以使用如下命令:
sudo dpkg-reconfigure ca-certificates
3.更新CA证书数据库
sudo update-ca-certificates
4. 导入成功。

Apache配置SSL可参考Server Guide - HTTPD and Server Guide - Certificates.
其它资源如下:

本地资源:

man config
       

System manual page for the OpenSSL library configuration files

man gendsa
       

System manual page for the gendsa DSA private key generator

man genrsa
       

System manual page for the genrsa RSA private key generator

man openssl
       

System manual page for the openssl command-line tool

man rand
       

System manual page for the rand pseudo-random byte generator utility

man x509
       

System manual page for the x509 certificate display and signing utility

WWW 资源

CACert, a FREE X.509 Certificate Authority

Creating a Certificate Authority (CA)

OpenSSL Certificate Authority Setup

OpenSSL Website

Public Key Infrastructure (X.509) (pkix)

CategorySecurity CategorySecurity CategorySecurity
2012-10-9 10:17
0
雪    币: 68
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
如今密码学中最常用的一种形式就是公钥加密。公钥加密利用密码对:公开密钥和私有密钥。公钥系统的工作原理是使用公开密钥加密,密文只能通过私钥解密。
公钥系统的一个典型应用是SSL和TLS。譬如,Apache使用https,http over ssl,虽然http本身没有提供加密服务,但是https可以实现http流量的加密。
证书用来发布服务器的公钥和其它信息,以及对该证书负责的机构的信息。证书可以由CA签名。CA是验证了证书中包含信息正确性的可信第三方机构。

证书的类型
为了搭建使用公钥系统的安全服务器,在大多数情况下,需要将证书请求(包括公钥),公司分身的证明以及相应的费用提交给CA。CA验证证书请求和身份,发回安全服务器的证书。
或者,可以生成自签名的证书。当然,商业化的服务器是不推荐使用自签名证书的。
以HTTPS为例,CA签名的证书相比自签名的证书有两个好处:
1.浏览器自动验证了证书,并开始安全会话,而不需要用户处理;
2. CA发布的证书可以保证通信服务器的身份;
大多数支持SSL的浏览器和计算机都包含默认承认的CA列表。如果浏览器发现了一个证书的发布方CA不在自己的列表,就需要用户的干预。有的应用会直接报错。

从CA获得证书的过程很简单:
1. 生成公钥/私钥对;
2. 基于公钥生成证书请求,证书请求中包含服务器和公司信息;
3. 发送请求和必要的证明给CA。并按照他们的要求填表。
4. 若CA验证信息无误,会发送证书回来;
5. 将该证书安装到安全服务器上,并进行适当的配置。

生成证书签名请求CSR(Certificate Signing Request)
不论是从CA获得证书还是自签名证书,第一步都是生成密钥。
如果证书用于服务守护进程,例如Apache,Postfix,DoveCot,密钥最好不用密码短语加密。否则,每次启动,都需要输入密码短语。下面介绍生成有密码短语加密的和不用密码短语加密的证书。并用没有加密的密钥生成证书。不用密码短语的好处是方便,但是密钥的丢失导致服务器的沦陷。
使用如下命令生成CSR密钥:
openssl genrsa -des3 -out server.key 1024
提示时,输入密码短语;最好长度为8。使用des3的时候,密码短语长度最短为4个字符,(生成rsa私钥,并用des3加密;为何只生成了私钥呢?),包含数字和/或标点,并且不是字典中的单词。密码短语大小写敏感。
生成不带密码短语的不安全密钥:
openssl rsa -in server.key -out server.key.insecure
mv server.key server.key.secure
mv server.key.insure server.key
使用server.key生成CSR:
openssl req -new -key server.key -out server.csr
提示输入密码短语,然后各种公司信息,生成server.csr文件。将该csr提交给CA处理。或者,可以使用该CSR生成自签名的证书。(这一部分内容和实验内容不符~~)

生成自签名的证书
命令:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

安装证书
将server.key和server.crt安装到服务器上:
sudo cp server.crt /etc/ssl/certs
sudo cp server.key /etc/ssl/private
然后只需要配置应用可以使用公钥加密,使用证书和密钥文件。(不明白~~;很明显的是,应用为啥会接受这个证书呢?另外,RSA的公钥在哪里呢?)

Certificate Authority
如果应用需要的不仅仅是自签名的证书,那么需要建立自己内部的CA。
1. 创建存放CA证书和其它文件的目录:
sudo mkdir /etc/ssl/cA
sudo mkdir /etc/ssl/newcerts
(这个也太不低调了,直接就存放在系统文件里~~)
2. CA需要文件来跟踪保存CA使用的序列号,每个证书都有唯一的序列号;以及CA发布的证书;
sudo sh -c "echo '01'>/etc/ssl/CA/serial"
sudo touch /etc/ssl/CA/index.txt
3. CA还需要一个配置文件,虽然不是必须的,但是在生成多个证书的时候会很方便。编辑/etc/ssl/openssl.cnf,在【CA_default】中修改:
dir             = /etc/ssl/             # Where everything is kept
database        = $dir/CA/index.txt     # database index file.
certificate     = $dir/certs/cacert.pem # The CA certificate
serial          = $dir/CA/serial        # The current serial number
private_key     = $dir/private/cakey.pem# The private key
4. 生成自签名的根证书:
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
会要求输入证书的各种信息
5.安装根证书和密钥
sudo mv cakey.pem /etc/ssl/private
sudo mv cacert.pem /etc/ssl/certs
6. 现在可以给证书签名了,首先需要证书签名请求CSR。有了CSR使用如下命令生成CA签名的证书:sudo openssl ca -in server.csr -config /etc/ssl./penssl.cnf
在输入CA密钥的密码之后,会提示证书签名,并commit该新证书。
7. 这时会有新文件/etc/ssl/newcerts/01.pem,包含同样的输出。
8. 拷贝该证书到主机,并进行配置。默认的保存证书的位置是/etc/ssl/certs。这样,多个应用就可以使用这个证书。

(感觉还是不清楚~~)

目前觉得该文档的问题很多,但是有一些基本的概念如index.txt,serial它解释的还是挺清楚的~~
2012-10-11 16:03
0
雪    币: 68
活跃值: (53)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
Apache是Linux系统上应用最广的web服务器。应用最广的传输网页的协议HTTP,安全协议HTTPS以及FTP在Apache都有支持。

Apache常和MySql,PHP,python和perl结合使用,LAMP(Linux, Apache, MySql,php/python/perl)配置形成了强大而健壮的开发和配置平台。

安装

apache2:
audo apt-get isntall apache2

配置
apache配置通过普通文件中的指令形式实现,这些指令分别位于以下的文件和目录中:
apache2.conf: 是apache2的主配置文件,存放着apache2的全局设置;
conf.d: 文件夹里的配置文件也是全局适用,其它使用apache2的服务可以添加文件或软链接到这个目录;
enwars: 存放apache2的环境变量;
httpd.conf: 之前曾是apache的主配置文件,名字来自与httpd守护进程;可用于用户设置的全局配置;
mods-available: 该目录保存的配置文件加载和使用模块,但并非所有模块都有配置文件;
ports.conf: 指明Apache2的监听端口;
sites-available: Apaches的虚拟主机,使得apache2可以对不同的站点有不同配置;
sites-enabled: 包含/etc/apache2/sites-available的符号链接;/sites-available的配置文件被链接之后,Apache2启动的时候该配置就会处于活动状态。

此外,其他的配置文件可以用Include命令,并且通配符可以包含多个配置文件,对配置文件的修改在apache2重启后起效。

服务器可以使用包含了mime文档类型的文件,文件名字通过TypesConfig指令设置,默认值/etc/mime.types.

基本设置

apache2的默认配置是virtual host友好的,默认有一个virtual host,以VirtualHost指令开始,同时,也可以作为多个virtual host的模板。如果用户不修改,默认的virtual host作为默认站点;可通过修改/etc/apache2/sites-available/default修改默认的virtual host.
对virtual host的配置只影响特定的virtual host。若一个directive全局有效,并且在virtual host的设置中没有设置,那么使用缺省设定。譬如,可以指定webmaster的email地址,而不用指定每个virtual host的mail address.

如果需要配置新的virtual host或地址,拷贝default:
sudo cp /etc/apache2/sites-available/default /etcapache2/sites-available/mynewsite

ServerAdmin项指定管理员的mail地址;默认邮件是webmaster@localhost,修改成自己的邮箱后,若网站出了问题,Apache2会发送错误信息的报告。
Listen项指明Apache监听的port,(IP可选)。如果没指名IP,那么apache2监听机器的所有IP。默认监听端口是80.若配置127.0.0.1:80,那么只监听环回地址,也即在公网不可用。该项在/etc/apache2/ports.conf中可配置。
2012-10-11 22:25
0
游客
登录 | 注册 方可回帖
返回
//