我是ZeroMQ的新手,并且一直在使用ZeroMQ NuGet包和NetMQ和NetMQ Security NuGet包来比较消息的安全性.
到目前为止,我还没有找到使用Curve Security的Ironhouse示例的C#版本.ZGuides回购中有一个"todo"项目,但到目前为止还没有实现.(https://github.com/metadings/zguide/issues/1)
我还试图确定NetMQ.Security安全方法是否优于ZeroMQ 4中内置的曲线安全方法.看起来大多数关于Curve的信息至少来自2014年或更早.
任何信息将不胜感激!
发布者和订阅者都需要使用自己的一组公钥\私钥。在订阅者的示例代码中,您设置了CurvePublicKey(设置为服务器的代码,这是错误的,但仍然是)但没有设置CurveSecretKey- 这就是为什么您得到“无法打开客户端 INITIATE vouch”的原因。这是来自另一个已修复问题的示例:
public class Program
{
static void Main(string[] args) {
using (var context = new ZContext()) {
Console.WriteLine($"Curve Supported: {ZeroMQ.ZContext.Has("curve")}");
byte[] serverPublicKey;
byte[] serverSecretKey;
Z85.CurveKeypair(out serverPublicKey, out serverSecretKey);
var publisher = new ZSocket(context, ZSocketType.PUB);
publisher.CurvePublicKey = serverPublicKey;
publisher.CurveSecretKey = serverSecretKey;
publisher.CurveServer = true;
publisher.Bind("tcp://*:5050");
var subscriber = new ZSocket(context, ZSocketType.SUB);
byte[] subPublicKey;
byte[] subSecretKey;
Z85.CurveKeypair(out subPublicKey, out subSecretKey);
subscriber.CurvePublicKey = subPublicKey;
subscriber.CurveSecretKey = subSecretKey;
subscriber.CurveServerKey = serverPublicKey;
ZError connectError;
subscriber.Connect("tcp://mybox:5050", out connectError);
if (connectError != null) {
Console.WriteLine($"Connection error: {connectError.Name} - {connectError.Number} - {connectError.Text}");
}
subscriber.SubscribeAll();
// Publish some messages
Task.Run(() => {
for (var i = 1; i <= 5; i++) {
var msg = $"Pub msg: {Guid.NewGuid().ToString()}";
using (var frame = new ZFrame(msg)) {
publisher.Send(frame);
}
}
});
Task.Run(() => {
// Receive some messages
while (true) {
using (var frame = subscriber.ReceiveFrame()) {
var msg = frame.ReadString();
Console.WriteLine($"Received: {msg}");
}
}
});
Console.WriteLine("Press ENTER to exit");
Console.ReadLine();
ZError subError;
subscriber.Disconnect("tcp://mybox:5050", out subError);
subscriber.Dispose();
ZError pubError;
publisher.Disconnect("tcp://*:5050", out pubError);
publisher.Dispose();
}
}
}
Run Code Online (Sandbox Code Playgroud)