これでしばらく壁に頭をぶつけていました。
Bloomberg FIX サーバーへの SSL 接続を確立するために、quickfix イニシエーターをセットアップしようとしています。docsに基づいて、これは比較的簡単に達成できると思いました。しかし、私はどこが間違っているのか理解できないようです。どんな援助でも大歓迎です。
注意事項:
- dotnet cliを使用してプロジェクトを作成、ビルド、実行しています
- Bloomberg は、JKS、PEM、および PKCS12 の 3 つの形式の証明書を提供してくれました。
- この S/O コメント (Convert PFX to CER)
mycerts.cer
で説明されているプロセスを使用して、提供された PKCS12 証明書から結果のファイルを生成しました。ただし、この手順を実行するかどうかに関係なく、エラー メッセージは同じです。 - また、以前に (SSL 接続を処理するために) python バージョンの quickfix と stunnel を使用して、ブルームバーグ FIX サーバーへの安全な接続を確立して維持したことも注目に値するかもしれません。ただし、stunnel への依存関係を削除する必要があるため、quickfix/n への切り替えを試みました
セットアップ:
.csproj
現在のファイルはこちら
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\Heimdall.AppTest\Heimdall.AppTest.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="QuickFIXn.Core" Version="1.10.0" />
<PackageReference Include="QuickFIXn.FIX4.4" Version="1.10.0" />
</ItemGroup>
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Copy SourceFiles=".\FIX44.xml" DestinationFolder="$(TargetDir)" />
<Copy SourceFiles=".\bbgEtomsClient.cfg" DestinationFolder="$(TargetDir)" />
<Copy SourceFiles=".\pkcs12\cert.pfx" DestinationFolder="$(TargetDir)" />
<Copy SourceFiles=".\openssl\mycerts.cer" DestinationFolder="$(TargetDir)" />
</Target>
</Project>
そして、これがイニシエータ アプリケーションによって使用される実際のbbgEtomsClient.cfg
ファイルです (この問題に基づいています) 。
[DEFAULT]
ApplicationID=client
ConnectionType=initiator
HeartBtInt=60
ResetOnLogon=N
ResetSeqNumFlag=N
FileStorePath=incoming
FileLogPath=outgoing
ScreenLogShowIncoming=Y
ScreenLogShowOutgoing=Y
ScreenLogShowEvents=Y
UseDataDictionary=Y
DataDictionary=FIX44.xml
SocketConnectPort=xxxx
SocketConnectHost=xxx.xx.xxx.xx (same as SSLServerName)
SSLEnable=Y
SSLProtocols=Tls12
SSLCheckCertificateRevocation=N
SSLValidateCertificates=N
SSLServerName=xxx.xx.xxx.xx
SSLCertificate=cert.pfx
SSLCertificatePassword=<PfxCertPassword>
SSLCACertificate=mycerts.cer
[SESSION]
BeginString=FIX.4.4
SenderCompID=<SenderCompID>
TargetCompID=<TargetCompID>
StartTime=00:00:01
EndTime=23:59:59
そして超基本はこちらprogram.cs
using System;
using System.Collections.Generic;
using System.Text;
using QuickFix;
using QuickFix.Fields;
using QuickFix.Transport;
using System.Linq;
namespace Heimdall.App
{
public class MyQuickFixApp : IApplication
{
public void FromApp(Message msg, SessionID sessionID)
{
Console.WriteLine("IN:<FromApp> " + msg);
}
public void OnCreate(SessionID sessionID) { }
public void OnLogout(SessionID sessionID) { }
public void OnLogon(SessionID sessionID) { }
public void FromAdmin(Message msg, SessionID sessionID)
{
Console.WriteLine("IN:<FromAdmin> " + msg);
}
public void ToAdmin(Message msg, SessionID sessionID)
{
Console.WriteLine("OUT:<ToAdmin> " + msg);
}
public void ToApp(Message msg, SessionID sessionID)
{
Console.WriteLine("IN:<ToApp> " + msg);
}
}
class Program
{
static void Main(string[] args)
{
SessionSettings settings = new SessionSettings("bbgEtomsClient.cfg");
IApplication myApp = new MyQuickFixApp();
IMessageStoreFactory storeFactory = new FileStoreFactory(settings);
ILogFactory logFactory = new FileLogFactory(settings);
SocketInitiator initiator = new SocketInitiator(
myApp,
storeFactory,
settings,
logFactory);
try
{
initiator.Start();
while (true)
{
System.Threading.Thread.Sleep(2000);
}
}
catch (System.Exception e)
{
Console.WriteLine("==FATAL ERROR==");
Console.WriteLine(e.ToString());
initiator.Stop();
}
}
}
}
エラー:
上記の設定を使用してプロジェクトを実行すると、次のエラーが発生します。
20210107-13:23:00.242 : Unexpected exception: System.ArgumentNullException: Value cannot be null. (Parameter 'value')
at System.Collections.CollectionBase.OnValidate(Object value)
at System.Security.Cryptography.X509Certificates.X509CertificateCollection.OnValidate(Object value)
at System.Collections.CollectionBase.System.Collections.IList.Add(Object value)
at System.Security.Cryptography.X509Certificates.X509CertificateCollection.Add(X509Certificate value)
at QuickFix.Transport.StreamFactory.SSLStreamFactory.GetClientCertificates()
at QuickFix.Transport.StreamFactory.SSLStreamFactory.CreateClientStreamAndAuthenticate(Stream innerStream)
at QuickFix.Transport.StreamFactory.CreateClientStream(IPEndPoint endpoint, SocketSettings settings, ILog logger)
at QuickFix.SocketInitiatorThread.SetupStream()
at QuickFix.Transport.SocketInitiator.SocketInitiatorThreadStart(Object socketInitiatorThread)
そして、私が理解できることから、私のエラーはこの問題に関連しているようです (.NetCore3.1 and QuickFIXn problem #571)