RO33 - RemObjects SDK 的SSL/TLS

 
RO33 - RemObjects SDK SSL/TLS
作者 Henrick Hellström           
Copyright © 2004 StreamSec, All Rights Reserved
RemObjects 提示 : 我们相信本文是正确的 , 但我们不做任何保证 . 在此感谢 Henrick 写的文章 , 很高兴在此发表 .
本文帮助你使用 StreamSec 工具实现 RemObjects SSL/TLS.
安全需求
SSL/TLS 在系统中典型用处是保证如下几点 :
  • 客户端可以保证要传输的数据都能准确的传输到目标主机而不会发送到其他的机器上.
  • 每个点都可以保证数据传输与目标接收内容是一致的(中间没有修改).
前一个需求要求加密的服务授权 (Authentication) 和密钥 (Confidentiality). 后一个需求要求加密的服务完整性 (Integrity).
认证 是通过包含在证书中的说明服务器或客户端身份的公钥或操作执行点对点传输的公钥 ( 非对称密钥 ) 来实现的 . 主机认证通过 SSL/TLS 握手实现 .
 
加密 通过如 AES 的对称算法来实现的 . 创建加密密钥事使用了握手中部分非对称算法 , 这样保证两个连接端都使用相同的密钥 . SSL/TLS 的每次会话和指示都使用独立的密钥 .
 
完整性 Integrity 通过消息认证码的 Hash 算法来实现的 . MAC 密钥也是通过握手建立起来的 , 没有会话和指示都是独立的 .
另外 , 当遇到如下需求时候可以使用 StreamSec SSL/TLS:
  • 服务端保证返回到客户端的数据只能被指定的客户端接收.这是通过使用客户端证书做客户端验证来实现的.
  • 当服务端加密私钥泄露是用其加密的数据不能被破解.这等同于要求服务端加密服务保证向前安全行. SSL/TLS中通过短期的Diffie-Hellman (DHE)密码组实现.
  •  
对中间层的特殊考虑
如果可以任意的相互操作就不用使用独立的客户端了 , 也没有必要使用一个服务发生的证书 . 运行使用 StreamSec 工具开发的证书机构比从外部购买证书更使用高效 .
软件开发者可以保证服务证书只为特定的应用程序颁发 . 如果客户端软件可以保证只能执行由 CA 颁发的服务证书指定的操作 , 那么就可以向 web 浏览器连接到 web 服务一样不用去强调基于主机名的验证 .
使用 CA 不是唯一的方式 , 但是可以获取明确的安全优势 . 这就是为什么 StreamSec 工具没有默认加载 Windows 证书库中的根证书 , 为什么花费大量的努力去开发基于 CA 操作的工具 .
 
步骤 1: 服务端的安全
本节描述使任意的 RO 应用服务安全化的步骤 . 保证你已经安装了所有必要的包 . 如果使用 RemObjects 3 Delphi 7 必须安装 SsRO3_70 .
RemObjects 组件面板的 TROServerTLSMessage 组件 , StreamSec 组件面板中的 TSimpleTLSInternalServer 组件 加入到主窗体 .

TROServerTLSMessage 组件被用来在服务组件和消息组件间做 TLS 过滤 . 首先 , TROServerTLSMessage 组件加入到服务组件的 Dispatchers 属性中 :
RO33 - RemObjects SDK 的SSL/TLS_第1张图片
接下来 , TROServerTLSMessage 组件的 Message 属性设置为真正的消息组件 ,TLSServer 属性为 TSimpleTLSInternalServer 组件 .
组件已经连接好 . 一般连接到服务的客户端只能看到使用 TROServerTLSMessage 组件处理 TLS 包的服务
RO33 - RemObjects SDK 的SSL/TLS_第2张图片
要使服务端能正常工作还需要两个步骤 . 首先 , 服务证书和私钥必须加载到 TSimpleTLSInternalServer 组件 . 也可以在其他设计时或运行期加载 . 在设计时加载 , 右击 TSimpleTLSInternalServer 组件点击 Open File. 打开由 StreamSec CertMgr 创建的服务证书 *.pfx 文件 :
RO33 - RemObjects SDK 的SSL/TLS_第3张图片
选择 *.pfx 文件点击 OK. 弹出输入密码窗口 :
RO33 - RemObjects SDK 的SSL/TLS_第4张图片
输入与你保存 *.pfx 文件是相同的密码 . 点击 OK. 弹出新的密码窗口 :
这个密码用于保护包含 *.pfx 文件中的私钥的 *.dfm 资源文件 . 输入密码点击 OK 按钮 . 弹出新的密码窗口 :

RO33 - RemObjects SDK 的SSL/TLS_第5张图片

每个私钥环有两个密码保护 . 密码防止向私钥环中写入 . 输入密码点击 OK. 现在文件中的内容可以被加载到 SimpleTLSInternalServer 组件中了 . 组件的 PublicKeyAlgorithms 属性作如图设置 :
RO33 - RemObjects SDK 的SSL/TLS_第6张图片
PublicKeyAlgorithms 属性指定加载的服务证书和私钥用于服务验证时使用 RSA 算法 .
最后的步骤是设置事件处理函数并写几行代码 .
  • FormCreate事件中调用SimpleTLSInternalServer1.TLSSetupServer.
  • 实际应用中可能要指定OnPassword事件处理程序. 你输入的密码(Password.SetKeyStr('abc'))是保护私钥环的. 如果你在代码中输入密码,并在设计时加载服务证书和私钥,你必须将你的执行文件等同于没有保护的私钥文件.
  • 强烈推进使用OnTLSChangeCipherSuite, OnTLSIncomingAlert OnTLSOutgoingAlert作日志记录. 使用TlsConst单元的AlertMsg函数将警告代码转换为可读的文字信息.
  • 注意TSimpleTLSInternalServer默认需要客户端证书.可使用Options属性设置.
  • 通常不要在中间层笼统地使用ARC4,DES3DES批量加密算法,可输出密码组, MD5 macRSA 等加密.推荐修改这些选项为Not Allowed 状态.
  • TROServerTLSMessage 组件实现了为TLSPeer执行提供属性的IROTLSMessage接口, 有调整客户端证书的属性. 使用这个属性可以建立客户端的标识.
步骤 : 客户端的安全化
TSimpleTLSInternalServer 一起 使用 TROSecureChannel 组件 .
TROSecureChannel 组件的 Channel TLSServer 属性连接到如下组件 :

RO33 - RemObjects SDK 的SSL/TLS_第7张图片

你必须修改 ROChannel TargetURL 指向 /ServerTLS 路径 :
RO33 - RemObjects SDK 的SSL/TLS_第8张图片
现在 , 所有的客户端调用都通过 TROSecureChannel 组件 . 修改 TRORemoteService 组件的 Channel 属性 :
RO33 - RemObjects SDK 的SSL/TLS_第9张图片
现在只要在写一些代码在 TSimpleTLSInternalServer 组件中加载键值和证书 . 强烈推进在设计时加载 *.scl 文件的 CA 证书 , 并在发布前在客户端的 *.exe 作签名 . 如果客户端证书经常在运行时加载 , 调用 ImportFromPFX 方法加载 *.pfx 文件 . *.pfx 文件是保存客户端私钥 , 客户端证书 , CA 证书并用密码保护的 PKCS#12 文件 .
*.pfx 文件可能使用其他 RO 客户端生成 . 通常推荐将 CA 服务器和你的安全应用服务器分离 . 运行 CA 服务的主机必须经过安全的配置并要绝对的保证 CA 私钥的机密 . 他平均为每个用户只工作几个月 , 所以可以支付其高昂的维护成本 , 通常的操作使用手动步骤 . 运行应用服务的主机应该配置为可执行 , 可靠 , 低维护成本 . 只要应用程序服务器经过适当的配置 ( 如没有服务运行在管理员权限之下 ) 几乎可以完全自动使用加密的协议 . 由于安全不断受到考验 , 所以你需要去检查并在必要的时候将现有 CA 证书撤销发布一个新的 . 客户端软件的安全最终依赖于 CA, 就没有必要去替换你的客户端程序了 .
注意 TSimpleTLSInternalServer 组件不包含下载证书的功能 . 可能你需要将 *.crl 文件上传到 Web 服务器上并使用 HTTP 客户端下载 .
 

你可能感兴趣的:(加密,算法,服务器,Authentication,web服务,Delphi)