当前位置: 首页 > 编程日记 > 正文

[原]SSL 开发简述(Delphi)

一、            简介

现在网上有关SSL的资料较多的是基于VC开发,DelphiSSL开发资源很少。

本文主要使用OpenSSL为基础,讲述SSL的有关开发流程。OpenSSL功能非常丰富,具体可以去她的官方网看看。可惜没有中文说明。

OpenSSLhttp://www.openssl.org/

一.1、           SSL协议是什么

SSL 是一个缩写,代表的是 Secure Sockets Layer。它是支持在 Internet 上进行安全通信的标准,并且将数据密码术集成到了协议之中。数据在离开您的计算机之前就已经被加密,然后只有到达它预定的目标后才被解密。证书和密码学算法支持了这一切的运转,使用 OpenSSL,您将有机会切身体会它们。

理论上,如果加密的数据在到达目标之前被截取或窃听,那些数据是不可能被破解的。不过,由于计算机的变化一年比一年快,而且密码翻译方法有了新的发展,因此,SSL 中使用的加密协议被破解的可能性也在增大。

可以将 SSL 和安全连接用于 Internet 上任何类型的协议,不管是 HTTPPOP3,还是 FTP。还可以用 SSL 来保护 Telnet 会话。虽然可以用 SSL 保护任何连接,但是不必对每一类连接都使用 SSL。如果连接传输敏感信息,则应使用 SSL

一.2、           什么是 OpenSSL

OpenSSL 不仅仅是 SSL。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字。关于 OpenSSL 库的内容非常多,远不是一篇文章可以容纳的。

OpenSSL 不只是 API,它还是一个命令行工具。命令行工具可以完成与 API 同样的工作,而且更进一步,可以测试 SSL 服务器和客户机。它还让开发人员对 OpenSSL 的能力有一个认识。

二、            CA概念描述

CA是证书的签发机构,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。

CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。

如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。

如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。

二.1、           证书

证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。

证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X509 国际标准。

如何在电子文档上实现签名的目的呢?我们可以使用数字签名。RSA公钥体制可实现对数字信息的数字签名,方法如下:

信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。

在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数) 生成的。对这些HASH函数的特殊要求是:

1.接受的输入报文数据没有长度限制;

2.对任何输入报文数据生成固定长度的摘要(数字指纹)输出;

3.从报文能方便地算出摘要;

4.难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要;

5.难以生成两个不同的报文具有相同的摘要。

验证:

收方在收到信息后用如下的步骤验证您的签名:

1.使用自己的私钥将信息转为明文;

2.使用发信方的公钥从数字签名部分得到原摘要;

3.收方对您所发送的源信息进行hash运算,也产生一个摘要;

4.收方比较两个摘要,如果两者相同,则可以证明信息签名者的身份。

如果两摘要内容不符,会说明什么原因呢?

可能对摘要进行签名所用的私钥不是签名者的私钥,这就表明信息的签名者不可信;也可能收到的信息根本就不是签名者发送的信息,信息在传输过程中已经遭到破坏或篡改。

二.2、           数字证书

数字证书为实现双方安全通信提供了电子认证。在因特网、公司内部网或外部网中,使用数字证书实现身份识别和电子信息加密。数字证书中含有密钥对(公钥和私钥)所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。

二.3、           使用数字证书能做什么?

数字证书在用户公钥后附加了用户信息及CA的签名。公钥是密钥对的一部分,另一部分是私钥。公钥公之于众,谁都可以使用。私钥只有自己知道。由公钥加密的信息只能由与之相对应的私钥解密。为确保只有某个人才能阅读自己的信件,发送者要用收件人的公钥加密信件;收件人便可用自己的私钥解密信件。同样,为证实发件人的身份,发送者要用自己的私钥对信件进行签名;收件人可使用发送者的公钥对签名进行验证,以确认发送者的身份。

在线交易中您可使用数字证书验证对方身份。用数字证书加密信息,可以确保只有接收者才能解密、阅读原文,信息在传递过程中的保密性和完整性。有了数字证书网上安全才得以实现,电子邮件、在线交易和信用卡购物的安全才能得到保证。

二.4、           认证、数字证书和PKI解决的几个问题

l         保密性 - 只有收件人才能阅读信息。

l         认证性 - 确认信息发送者的身份。

l         完整性 - 信息在传递过程中不会被篡改。

l         不可抵赖性 - 发送者不能否认已发送的信息。

三、            搭建SSL工作流程

(搭建OpenSSL

(根证书获取方法图)

四、            开发

四.1、           编译OpenSSL

四.1.1、    搭建准备工作

1、 OpenSSL源代码,可以直接到官网下载最新代码。

2、 标准C编译器(可以用VC,这里使用的是VC),编译动态库。

3、 Perl5编译环境,OpenSSL编译需要Perl环境。官网有的下。

四.1.2、    编译动态库

OpenSSL源代码库路径: c:"opensslsource

1、 进入VC命令行编译环境

2、 进入OpenSSL源代码目录: cd c:"opensslsource

3、 执行configure perl Configure VC-WIN32 --prefix=c:/openssl

4、 创建Makefile文件: ms"do_ms

5、 编译动态库:nmake –f ms"ntdll.mak

6、 测试动态库:nmake –f ms"ntdll.mak test

7、 安装动态库:nmake –f ms"ntdll.mak install

8、 清除零时文件,以后便于重新编译: nmake –f ms"ntdll.mak clean

说明:要生成VC的静态库只要编译 ms"nt.mak make文件。

四.2、           生成证书

由于OpenSSL的命令繁多,这里不详细说明。具体可以看:BBS水木清华站(FriNov102024102000) fordesign@21cn.com翻译的内容。已经整理成文档放在目录中。

四.2.1、    生成服务器端的私钥(key文件)

openssl genrsa -des3 -out serverkey 1024

运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法。),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令。如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!

去除key文件口令的命令:

openssl rsa -in server.key -out server.key

四.2.2、    生成证书请求

openssl req -new -key server.key -out server.csr -config openssl.cnf

生成Certificate Signing RequestCSR),生成的csr文件交给CA签名后形成服务端自己的证书。屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可。

四.2.3、    生成客户keycsr文件

openssl genrsa -des3 -out client.key 1024

openssl req -new -key client.key -out client.csr -config openssl.cnf

四.2.4、    CA证书签证

CSR文件必须有CA的签名才可形成证书,可将此文件发送到verisign等地方由它验证。CA验证需要服务费,做测试使用可以自己生成。

openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf

四.2.5、    生成签证文件

用生成的CA的证书为刚才生成的servercsrclientcsr文件签名:

Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf

Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf

四.2.6、    合成pem文件

Pem文件是 X.509 PAM 编码(Base64)文件,是个文本文件。可以使用x.509命令进行合成,或直接拷贝粘贴。

上面生成的server文件和client文件合并成2pem文件。

server使用的文件有:ca.crtserver.crtserver.key

client使用的文件有:ca.crtclient.crtclient.key

.crt文件和.key文件合并到同一个文件.pem文件。

四.3、           Delphi接入

上面生成OpenSSL动态库我们现行可以直接加载使用。另外Indy组件封装了OpenSSL的功能模块,可以引用uIdSSLOpenSSLHeaders.pas单元文进行开发。

直接加载动态库开发比较烦琐,所以我们直接适用Indy提供的单元开发。Indy单元文件实现的版本比较老,因此新DLL加载会发生错误。在网上找到一个支持 0.9.7i OpenSSL较新动态库的Indy单元文件。

具体的开发应用可以看Source中的代码。

四.3.1、    服务器端调用流程

四.3.2、    客户段调用流程

转载于:https://www.cnblogs.com/gleam/archive/2008/05/09/1190205.html

相关文章:

如何每天自动备份 SourceSafe (转)

在Microsoft Visual SourceSafe中提到管理员应该每天或者至少每周备份一次SourceSafe中的内容。这里&#xff0c;我们利用现有的工具实现每天自动备份SourceSafe中的内容。<?XML:NAMESPACE PREFIX O />1. 用到的工具a. ssarc.exe. ssarc.exe是随着SourceSafe提供…

log.net的应用示例(日志)

log.net的应用很多朋友很清楚&#xff0c; 为了使不会用的朋友快速了解&#xff0c;这里我也搜了一些朋友的贴子http://blog.hnce.net/post/246.html后做如下示例&#xff0c;希望能对大家有所帮助&#xff1a; 示例如下&#xff1a; log4net的配置文件link Log4Net.config1&l…

H国的身份证号码(搜索)

个人心得&#xff1a;巧妙利用数字进行维护就好了&#xff0c;深搜还是有点心得的&#xff1b; #1558 : H国的身份证号码I 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 H国的身份证号码是一个N位的正整数(首位不能是0)。此外&#xff0c;由于防伪需要&#xff0c;一个N…

Linux命令之more

more [选项] 文件 […] more是一个过滤器&#xff0c;用于一次浏览一个屏幕的文本。 在more过滤器下有一些常用键&#xff0c;<Space>表示显示下一屏内容&#xff1b;<Enter>表示显示文本的下一行内容&#xff1b;<H>显示帮助&#xff1b;<B>上一页&am…

图的创建及深度遍历

#include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2#define INFINITY INT_MAX //最大值为无穷大 #define MAX_VER…

showModalDialog 传值及刷新

(一)showModalDialog使用例子,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口. farther.html --------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITL…

简单实现ConfigurationManager.AppSettings[]效果存储系统变量

代码一:存储变量和常量的Class.Code1using System; 2using System.Collections.Generic; 3using System.Text; 4using System.Collections.Specialized; 5 6namespace TestTemp.ConsoleApp 7{ 8 public class Config 9 {10 string[] keys new string[] { "N…

数据结构|-常见数据结构整理

归纳总结了一下数据机构的常用类型&#xff0c;个人理解常用的数据机构可以分为线性表、栈、队列、树&#xff0c;线性表包括顺序表和链表&#xff0c;栈和队列应当属于特殊的线性表&#xff0c;有几个概念和误区需要先说一下 顺序表和线性表的关系&#xff1a; 线性表是逻辑概…

数据结构课程上机参考代码

SqList #include <iostream>using namespace std;#include <malloc.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status; /* int是函数的类型,其值是函数结果状态代码&#xff0c;如OK等 */…

我的路子 - 发现游戏为模型的软件架构方式

总觉得如果一个内容被深刻地理解了&#xff0c;那么当在他口中说出来的时候&#xff0c;应该是很简单才对。 所以一直觉得&#xff0c;编程里那些不容易理解的&#xff0c;需要记住很多内容的东西都是有缺陷的。自己又比较自我认可强&#xff0c;看不到别人的角度&#xff0c;表…

Vim对中文编码的支持[转]

Vim对中文编码的支持[转] Vim对中文编码的支持 1、支持中文编码的基础 Vim要更好地支持中文编码需要两个特性&#xff1a;multi_byte和iconv&#xff0c;可以用|:version|命令检查当前使用的Vim是否支持&#xff0c;否则的话需要重新编译。 2、影响中文编码的设置项 Vim中有几个…

C/C++中extern关键字详解

1 基本解释 &#xff1a;extern可以置于变量或者函数 前&#xff0c;以标示变量或者函数的定义在别的文件中 &#xff0c;提示编译器遇到此变量和函数时在其他模块中寻找其定义 。此外extern也可用来进行链接指定。 也就是说extern有两个作用&#xff0c;第一个,当它与"C&…

关于WPF的ComboBox中Items太多而导致加载过慢的问题

【WFP疑难】关于WPF的ComboBox中Items太多而导致加载过慢的问题 周银辉我的一个同事在加载字体列表时遇到了一个让人崩溃的问题&#xff1a;由于系统字体可能较多&#xff08;可能有好几百项&#xff09;&#xff0c;导致使…

什么是3G通信

现在“3G通信”快要成为人们嘴上的口头禅了&#xff0c;那么您知道到底什么是3G通信吗&#xff1f;所谓3G&#xff0c;其实它的全称为3rd Generation&#xff0c;中文含义就是指第三代数字通信。1995年问世的第一代数字手机只能进行语音通话&#xff1b;而1996到1997年出现的第…

springMVC入门截图

mvc在bs系统下的应用 ---------------------------------------------------- 在web.xml中配置前端控制器&#xff08;系统提供的一个servlet类 只需配置即可 无需程序员开发 &#xff09; -------------------------------------------------------------- ----------------…

Linux环境下的网络编程

本文介绍了在Linux环境下的socket编程常用函数用法及socket编程的一般规则和客户/服务器模型的编程应注意的事项和常遇问题的解决方法&#xff0c;并举了具体代 码实例。要理解本文所谈的技术问题需要读者具有一定C语言的编程经验和TCP/IP方面的基本知识。要实习本文的示例&am…

WEBSHELL恶意代码批量提取清除工具

场景 使用D盾扫描到WEBSHELL后可以导出有路径的文本文件。 最后手动去把WEBSHELL复制到桌面然后以文件路径命名&#xff0c;挨个删除。 D盾界面是这样的。 手动一个个找WEBSHELL并且改名效率太低&#xff0c;使用MFC写一个小工具方便去现场以后查WEBSHELL的工作。 技术思路 D盾…

判定两棵二叉树是否相似以及左右子树交换、层次编号

#include <iostream> using namespace std; #include <malloc.h> #include <stdio.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2#define MAX_TREE_SIZE 100//二叉树的最大结点数 typedef cha…

[Tracking] KCF + KalmanFilter目标跟踪

基于KCF和MobileNet V2以及KalmanFilter的摄像头监测系统 简介 这是一次作业。Tracking这一块落后Detection很多年了&#xff0c;一般认为Detection做好了&#xff0c;那么只要能够做的足够快&#xff0c;就能达到Tracking的效果了&#xff0c;实则不然&#xff0c;现在最快的我…

.net wap强制输出WML

强制输出WML:在web.config添加下面内容<system.web>下<browserCaps><result type"System.Web.Mobile.MobileCapabilities, System.Web.Mobile, Version1.0.5000.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a"/><use var"HTTP_USER_…

Tomcat在Linux上的安装与配置

1.安装好linux系统&#xff0c;下载适合的 Tomcat(jdk)下载JDK与Tomcatjdk 下载Tomcat 下载参考地址&#xff1a;jdk下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.htmltomcat下载地址:http://tomcat.apache.org /download-70.cgi…

上机实践 1 初识 Java

实验 1 一个简单的 Java 应用程序 一、实验目的 掌握开发 Java 应用程序的 3 个步骤&#xff1a;编写源文件、编译源文件和运行应用程序。 二、实验要求 1. 参照教材中的指导&#xff0c;使用网络课程中提供的链接下载并安装 JKD 并配置环境变量。 2. 编写一个简单的 Java…

论COSPLAY / 谨以此文纪念我暂短的Cos生涯

COSPLAY是什么COSPLAY这一名词是是英文Costume Play&#xff08;服饰扮演&#xff09;的缩写&#xff0c;从事COSPLAY相关活动的人员一般被称为COSPLAYER。目前流行的COSPLAY活动内容主要集中于通过服装、道具、饰品等扮演动漫作品中的人物角色&#xff0c;而从宽泛的意义上来说…

python 3下对stm32串口数据做解析

1、最近有个想做一个传感器数据实时显示的上位机&#xff0c;常规的数据打印太频繁了&#xff0c;无法直观的看出数据的变化。 python下的上位机实现起来简单一点&#xff0c;网上找了一些python界面Tkinter相关资料和python串口的demo.测试实现了简单的数据显示。 Mark 一下问…

《深入理解计算机系统》第八章——异常控制流知识点总结

课本习题&#xff1a; 8.11 #include <unistd.h> #include <stdio.h>int main(){int i;for(i0;i<2;i) fork();printf("hello\n");exit(0);}/** Result:* hello* hello* hello* hello*/ 8.12 #include <stdio.h> #include <unistd.h>vo…

vs2003复制一个web窗体,没有更改指向同一个cs 文件,引发大问题

今天我在原来的考试系统的出题模块中,input模块,因为增加的一个web窗体编译有问题,于是就复制了原来的启动项页面input,再改了名字为set1,然后在set1页面上删除了控件和代码,再把set1设置为启动项,谁知道问题出来了:因为两个aspx文件都是指向同一个CS文件&#xff0c;从他们的H…

8.29 对象?数组?

今天发现我的filter函数有问题&#xff0c;翻不了页&#xff0c;一直报错&#xff1a; 这是一个封装好的Array原型扩展函数。 /* Array 原型方法扩展 */(function() {$.extend(Array.prototype, {// 添加内容&#xff0c;比push多一个检查相同内容部分add: function(item) {if …

Nginx的作用

1、Nginx简介&#xff1a; 2、简介&#xff1a; Nginx是一个高性能的HTTP和反向代理服务器。 支持的操作系统众多&#xff0c;windows、linux、MacOSX 可实现负载均衡 Rewrite功能强大 电商架构大部分都采用NginxTomcat的架构 3、命令行使用&#xff1a; 三个命令&#xff1a;(…

(转)TabContainer要实现服务器端回传

TabContainer要实现服务器端回传,出来在后台实现 OnActiveTabChanged 事件外, 还需要在前台实现 OnClientActiveTabChanged 事件&#xff0c;这是关键。 <asp:UpdatePanel ID"UpdatePanel1"runat"server"ChildrenAsTriggers"true"><con…

python 获取脚本所在目录

pythonsys.path__file__abspathrealpath 平时写python经常会想获得脚本所在的目录&#xff0c;例如有个文件跟脚本文件放在一个相对的目录位置&#xff0c;那就可以通过脚本文件的目录找到对应的文件&#xff0c;即使以后脚本文件移到其他地方&#xff0c;脚本也基本不需要改动…