
本文档旨在指导开发者如何使用 Python QuickFIX 库通过 Stunnel 建立安全的 FIX (Financial Information eXchange) 连接。我们将详细介绍 Stunnel 的配置,QuickFIX 应用程序的设置,并提供调试技巧,以解决连接断开等常见问题,确保 FIX 消息的可靠传输。
1. Stunnel 配置
Stunnel 用于创建客户端和服务器之间的加密连接。以下是一个 Stunnel 客户端配置示例:
CAfile=./Roots.crt cert=./cert.pfx client=yes verify=1 sslVersion = TLSv1.2 options = NO_SSLv2 options = NO_SSLv3 debug=7 foreground=yes output=./stunnel.log [SESSION] accept=8080 connect=EXAMPLE_URL:EXAMPLE_IP
配置项说明:
- CAfile: CA 证书文件的路径,用于验证服务器证书。
- cert: 客户端证书和私钥文件的路径。
- client: 设置为 yes 表示 Stunnel 作为客户端运行。
- verify: 设置证书验证级别。 1 表示验证服务器证书。
- sslVersion: 指定使用的 TLS 版本。推荐使用 TLSv1.2 或更高版本。
- options: 禁用不安全的 SSL 协议版本。
- debug: 设置调试级别。 7 为最高级别,提供最详细的日志信息。
- foreground: 使 Stunnel 在前台运行,方便查看日志。
- output: 指定日志文件的路径。
- accept: Stunnel 监听的本地端口。
- connect: 要连接的远程服务器地址和端口。
注意事项:
立即学习“Python免费学习笔记(深入)”;
- 确保证书文件的权限设置正确,避免出现 "Insecure file permissions" 错误。
- 使用 checkHost 或 checkIP 配置项来限制信任的证书,提高安全性。
- 根据实际情况调整调试级别,以便获取足够的日志信息进行问题排查。
2. QuickFIX 配置
QuickFIX 应用程序需要配置连接参数,例如目标服务器地址、端口、会话 ID 等。以下是一个 QuickFIX Initiator 配置文件示例:
[DEFAULT] ConnectionType=initiator LogonTimeout=10 ReconnectInterval=30 FileLogPath=./Logs/ [SESSION] BeginString=FIXT.1.1 DefaultApplVerID=9 SenderCompID=EXAMPLE_COMP_SENDER TargetCompID=EXAMPLE_COMP_TARGET StartTime=00:00:00 EndTime=00:00:00 HeartBtInt=30 CheckLatency=N MaxLatency=240 SocketConnectPort=8080 SocketConnectHost=127.0.0.1 UseDataDictionary=Y TransportDataDictionary=./FIX50SP2.xml FileStorePath=./Sessions/
配置项说明:
- ConnectionType: 设置为 initiator 表示应用程序作为连接发起方。
- LogonTimeout: 登录超时时间,单位为秒。
- ReconnectInterval: 重新连接的间隔时间,单位为秒。
- FileLogPath: 日志文件存放路径。
- BeginString: FIX 协议版本。
- DefaultApplVerID: 默认的应用版本 ID。
- SenderCompID: 发送方 CompID。
- TargetCompID: 接收方 CompID。
- StartTime 和 EndTime: 会话有效时间段。
- HeartBtInt: 心跳间隔,单位为秒。
- CheckLatency: 是否检查延迟。
- MaxLatency: 最大延迟,单位为秒。
- SocketConnectPort: 连接的本地 Stunnel 监听端口(Stunnel 配置中的 accept 端口)。
- SocketConnectHost: 连接的本地 Stunnel 监听地址,通常为 127.0.0.1。
- UseDataDictionary: 是否使用数据字典。
- TransportDataDictionary: 数据字典文件的路径。
- FileStorePath: 会话文件存放路径。
注意事项:
立即学习“Python免费学习笔记(深入)”;
- 确保 SocketConnectPort 和 SocketConnectHost 与 Stunnel 的配置一致,即连接到 Stunnel 监听的端口和地址。
- 根据实际情况调整心跳间隔,避免因心跳超时导致连接断开。
- 检查数据字典文件是否与 FIX 协议版本匹配。
3. Python QuickFIX 代码示例
以下是一个简单的 Python QuickFIX Initiator 代码示例:
Countly 是一个实时的、开源的移动分析应用,通过收集来自手机的数据,并将这些数据通过可视化效果展示出来以分析移动应用的使用和最终用户的行为。截至2019年,支持超过2500个网站,16000个移动应用程序和多个桌面应用程序。它从移动,桌面,Web收集数据包括Apple Watch,TvOS和其他互联网连接设备的应用程序,并将这些信息可视化以分析应用程序使用情况和最终用户行为。
import quickfix as fix
class Application(fix.Application):
orderID = 0
execID = 0
def gen_ord_id(self):
print("gen_ord_id")
return 1
def onCreate(self, sessionID):
print("onCreate : Session (%s)" % sessionID.toString())
return
def onLogon(self, sessionID):
self.sessionID = sessionID
print("Successful Logon to session '%s'." % sessionID.toString())
return
def onLogout(self, sessionID):
print("onLogout")
return
def toAdmin(self, sessionID, message):
print("toAdmin")
return
def fromAdmin(self, sessionID, message):
print("fromAdmin")
return
def toApp(self, sessionID, message):
print("Recieved the following message: %s" % message.toString())
return
def fromApp(self, message, sessionID):
print("fromApp")
return
config_file = "./initiator.cfg"
settings = fix.SessionSettings(config_file)
application = Application()
storeFactory = fix.FileStoreFactory(settings)
logFactory = fix.FileLogFactory(settings)
initiator = fix.SocketInitiator(application, storeFactory, settings, logFactory)
initiator.start()代码说明:
- Application 类继承自 fix.Application,用于处理 FIX 消息。
- onCreate、onLogon、onLogout 等方法是 FIX 应用程序的回调函数,用于处理会话事件。
- toAdmin 和 fromAdmin 方法用于处理管理消息。
- toApp 和 fromApp 方法用于处理应用消息。
- fix.SessionSettings 用于加载配置文件。
- fix.FileStoreFactory 用于创建消息存储工厂。
- fix.FileLogFactory 用于创建日志工厂。
- fix.SocketInitiator 用于创建 Socket Initiator。
- initiator.start() 启动 Initiator。
运行步骤:
- 保存上述代码为 test.py。
- 创建 initiator.cfg 文件,并配置相应的参数。
- 运行 python test.py。
4. 调试技巧与问题排查
问题:Stunnel 连接立即断开。
可能原因:
- 心跳超时: 如果 QuickFIX 应用程序在指定的心跳间隔内没有发送或接收任何消息,服务器可能会断开连接。
- 配置错误: Stunnel 或 QuickFIX 配置文件中的参数可能不正确。
- 网络问题: 网络连接不稳定或存在防火墙等问题。
- 证书问题: 证书配置不正确或证书已过期。
调试方法:
- 检查日志: 查看 Stunnel 和 QuickFIX 的日志文件,查找错误信息。
- 调整心跳间隔: 增加 QuickFIX 配置文件中的 HeartBtInt 值。
- 检查配置: 仔细检查 Stunnel 和 QuickFIX 的配置文件,确保参数正确。
- 网络测试: 使用 ping 或 telnet 命令测试网络连接是否正常。
- 证书验证: 使用 OpenSSL 命令验证证书是否有效。例如:openssl verify -CAfile Roots.crt cert.pem
发送心跳请求:
QuickFIX 会自动处理心跳消息。如果需要手动发送心跳请求,可以创建一个 Heartbeat 消息并发送。例如:
import quickfix as fix
# ... (省略 Application 类的定义)
def onLogon(self, sessionID):
self.sessionID = sessionID
print("Successful Logon to session '%s'." % sessionID.toString())
# 发送心跳请求
heartbeat = fix.Heartbeat()
fix.Session.sendToTarget(heartbeat, sessionID)
return总结:
通过正确配置 Stunnel 和 QuickFIX,并结合调试技巧,可以成功建立安全的 FIX 连接。仔细检查日志信息,并根据实际情况调整配置参数,是解决问题的关键。









