qt使用sslSocket及openssl生成证书__心得

来源:互联网 发布:恋爱天数计算器软件 编辑:程序博客网 时间:2024/06/05 13:06


openssl下载:
http://slproweb.com/products/Win32OpenSSL.html


***************************************************


证书文件生成心得:


* cmd命令进入命令行:


* cd命令进入目录:安装目录/bin


* PEM下有个demoCA,把它拷到安装目录下和bin同级,不然会提示找不到这个文件夹,找不到的文件或文件夹自己新建也行


* 如果服务器证书和客户端证书创建时信息太相似,可能用ca文件sign第二个证书时的时候提示error,把index.txt删除新建一个再sign就OK了


* 在填写证书创建信息时,有个common name,这个cn在客户端调用connectToHostEncrypted(,,third param)时,第三个参数要用,不然程序报错
“The issuer certificate of a locally looked up certificate could not be found”






1.首先要生成服务器端的私钥(key文件):
openssl genrsa -des3 -out server.key 1024
运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法.),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!
去除key文件口令的命令:
openssl rsa -in server.key -out server.key


2.openssl req -new -key server.key -out server.csr -config openssl.cfg
生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可.


3.对客户端也作同样的命令生成key及csr文件:
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cfg


4.CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cfg


5.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cfg
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cfg


现在我们所需的全部文件便生成了.


另:
client使用的文件有:ca.crt,client.crt,client.key
server使用的文件有:ca.crt,server.crt,server.key
.crt文件和.key可以合到一个文件里面,本人把2个文件合成了一个.pem文件(直接拷贝过去就行了)






******************************************


QT使用QSslSocket资料:




http://doc.qt.digia.com/4.7/network-securesocketclient.html   qt4.7自带example


http://qt-project.org/forums/viewthread/21799


http://qt-project.org/forums/viewthread/21401


http://wenku.baidu.com/view/31937ec60c22590102029d9c.html


http://dgraves.org/content/qt-notes-working-qsslsocket


http://blog.sina.com.cn/s/blog_572390880100iamp.html


http://lovesea.blog.51cto.com/382446/95572/




***************************************************


证书的使用:
You still have to use addCaCertificates with ca.crt on the client side to authenticate the server, and that's the only certificate you need if you only want the server to be authenticated and allow any client to connect.


If you also want your client to be authenticated, you should use:
On the client:
- setLocalCertificate (), with client_sign.crt
- setPrivateKey (), with client.key
On the server, to allow only clients with a certificate:
- setPeerVerifyMode(QSslSocket::VerifyPeer)






************************************************
SSL工作原理 
SSL协议使用不对称加密技术实现会话双方之间信息的安全传递。可以实现信息传递的保密性、完整性,并且会话双方能鉴别对方身份。不同于常用的http协议,我们在与网站建立SSL安全连接时使用https协议,即采用https://ip:port/的方式来访问。
当我们与一个网站建立https连接时,我们的浏览器与Web Server之间要经过一个握手的过程来完成身份鉴定与密钥交换,从而建立安全连接。具体过程如下: 
1.用户浏览器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送到服务器。 
2.服务器将其SSL版本号、加密设置参数、与session有关的数据以及其它一些必要信息发送给浏览器,同时发给浏览器的还有服务器的证书。如果配置服务器的SSL需要验证用户身份,还要发出请求要求浏览器提供用户证书。 
3.客户端检查服务器证书,如果检查失败,提示不能建立SSL连接。如果成功,那么继续。 
4.客户端浏览器为本次会话生成pre-master secret,并将其用服务器公钥加密后发送给服务器。 
5.如果服务器要求鉴别客户身份,客户端还要再对另外一些数据签名后并将其与客户端证书一起发送给服务器。 
6.如果服务器要求鉴别客户身份,则检查签署客户证书的CA是否可信。如果不在信任列表中,结束本次会话。如果检查通过,服务器用自己的私钥解密收到的pre-master secret,并用它通过某些算法生成本次会话的master secret。 
7.客户端与服务器均使用此master secret生成本次会话的会话密钥(对称密钥)。在双方SSL握手结束后传递任何消息均使用此会话密钥。这样做的主要原因是对称加密比非对称加密的运算量低一个数量级以上,能够显著提高双方会话时的运算速度。 
8.客户端通知服务器此后发送的消息都使用这个会话密钥进行加密。并通知服务器客户端已经完成本次SSL握手。 
9.服务器通知客户端此后发送的消息都使用这个会话密钥进行加密。并通知客户端服务器已经完成本次SSL握手。 
10.本次握手过程结束,会话已经建立。双方使用同一个会话密钥分别对发送以及接受的信息进行加、解密。