2016-08-23 191 views
4

我有一个使用QuickFIX/J编写的应用程序来连接彭博服务器。最近彭博社为他们的服务器添加了CA证书验证,并且他们为握手提供了额外的CA证书文件。QuickFIX/J CA证书验证

我的应用程序使用SSL连接,当从彭博方面禁用CA证书验证时,应用程序成功连接到服务器并获取消息。启用CA验证时握手失败。

下面是我试过的步骤。

  1. 以前我使用ImportKey Java类来添加证书和密钥。 我将其更改为添加多个证书。如果需要,我可以发布 Java类。
  2. 当我使用openssl s_client连接到服务器时,它成功连接到服务器。

是否有任何需要在应用程序级别上进行更改?组态?或者在Java密钥库级别有什么要做的?当连接如下加入

错误消息来了:

20160823-06:04:15,FIX.4.4:XXXX-> XXXX,误差>(断开:插座 异常(/XXXX.XXXX。 XXX.XX:20237): javax.net.ssl.SSLHandshakeException:SSL握手失败) 成功退出为的sessionId:FIX.4.4:XXXX-> XXXX

任何帮助表示赞赏!


配置:

[default] 
# Settings which apply to all the Sessions. 

ConnectionType=initiator 
LogonTimeout=86400 
ResetOnLogon=Y 
UseDataDictionary=Y 
MaxLatency=240 

#StartTime=00:00:00 
#EndTime=00:00:00 

#StartTime=02:30:00 
#EndTime=12:30:00 

StartTime=02:21:00 
EndTime=12:21:00 

HeartBtInt=30 
ReconnectInterval=5 

[session] 
# Settings specifically for one session 
BeginString=FIX.4.4 
SocketConnectHost=xxx.xxx.xxx.xxx 
SocketUseSSL=Y 
SocketKeyStorePassword=importkey 
CheckLatency=N 

#SendResetSeqNumFlag=Y 

# new setups 

FileLogHeartbeats=Y 
##----- CAPS Configuration ---------## 

FileStorePath=/etc/bloomburg-live/msgs 
FileLogPath=/etc/bloomburg-live/logs 
DataDictionary=/etc/bloomburg-live/conf/FIX44.xml 
SocketKeyStore=/root/.keystore 
TargetCompID=BLPSTP 
SocketConnectPort=xxxxx 
SenderCompID=CAPSTP 

# log configuration 

FileIncludeMilliseconds=Y 
FileIncludeTimeStampForMessages=Y 
ScreenLogShowHeartBeats=Y  
#Filter heartbeats from output (both incoming and outgoing) 

PS - 无CA证书验证的应用工作。启用CA证书验证时出现错误。

+0

Downvote?这是为什么? – ambarox

+0

也许你应该显示处理证书的代码片段。 –

+0

没有代码片段只有配置。并且没有配置来处理ca证书。 – ambarox

回答

3

是的,如果应用程序以前使用ssl。你不需要在应用程序方面做任何改变。通常Quickfix/j正在像java一样处理ssl验证。这意味着openssl和java keytool将为你解决问题。所以下面列出了步骤。

  1. 使用信任证书,私钥和证书创建pkcs12密钥库。
$ openssl pkcs12 -export -chain -in certificate.pem -inkey encodedKey.pem -out keystore.p12 -name importkey -CAfile CAcertificate.pem 

输入导出密码:importkey 验证 - 输入导出密码:importkey

  • 使用密钥工具导入PKCS12密钥存储到所得到的密钥库使用quickfix/j调用/root/.keystore。再次,您可以选择不同的密码。
  • keytool -importkeystore -destkeystore /root/.keystore -srckeystore keystore.p12 -alias importkey 
    Enter destination keystore password: importkey 
    Re-enter new password: importkey 
    Enter source keystore password: importkey 
    
  • 更改配置文件和密钥库复制到类路径。
  • SocketKeyStore=keystore.ImportKey 
    cp /root/.keystore keystore.ImportKey /your/classpath 
    

    完蛋了。 请注意,由于quickfix/j正在维护其自己的密钥库,因此将ssl密钥和证书添加到java密钥库中对quickfix/j不起作用。因此,请确保在密钥添加过程之后将密钥库添加到类路径中。

    参考 - https://blogs.oracle.com/jtc/entry/installing_trusted_certificates_into_a

    +0

    cp /root/.keystore究竟在哪里复制? – fiddle

    +0

    它应该复制到你的班级路径,我将编辑答案。感谢提及。 – ambarox

    +0

    我很困惑。我不知道这个'/ root/.keystore'所在的位置。我在Win OS btw上。另外,如果我正在查看我安装我的FIX程序进行测试的位置,我没有看到任何'root'子目录。这些步骤是否适用于* nix系统? PS:我也处于我将连接到彭博社的状况。你使用的是哪个版本的QuickFIX/J? 1.5.3? 1.6.x版? –