我对ZeroMQ相当陌生,并且一直在比较使用ZeroMQ NuGet包和NetMQ & NetMQ Security NuGet包的消息安全性。
到目前为止,我还没有找到使用曲线安全性的Ironhouse示例的C#版本。在ZGuides回购上有一个"todo“项,但是到目前为止还没有实现。(https://github.com/metadings/zguide/issues/1)
我还试图确定NetMQ.Security安全方法是否比内置在ZeroMQ 4中的曲线安全方法更好。似乎大多数关于曲线的信息至少是从2014年或更早开始的。
如有任何信息,将不胜感激!
发布于 2017-11-01 10:00:40
发布服务器和订阅服务器都需要使用自己的一组公钥\私钥。在订阅者的示例代码中,您将CurvePublicKey设置为服务器(这是错误的,但仍然是这样),但不要设置CurveSecretKey --这就是为什么您不能打开客户端启动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();
}
}
}发布于 2021-07-29 09:52:12
实际上,使用C#的NetMQ示例不多。我发现这个“CurveTests.cs”很管用:
public void CurveTest()
{
var serverPair = new NetMQCertificate();
using var server = new DealerSocket();
server.Options.CurveServer = true;
server.Options.CurveCertificate = serverPair;
server.Bind($"tcp://127.0.0.1:55367");
var clientPair = new NetMQCertificate();
using var client = new DealerSocket();
client.Options.CurveServerKey = serverPair.PublicKey;
client.Options.CurveCertificate = clientPair;
client.Connect("tcp://127.0.0.1:55367");
for (int i = 0; i < 100; i++)
{
client.SendFrame("Hello");
var hello = server.ReceiveFrameString();
Assert.Equal("Hello", hello);
server.SendFrame("World");
var world = client.ReceiveFrameString();
Assert.Equal("World", world);
}
}注意:如果您想在不同的应用程序之间共享服务器公钥,请不要使用字符串表示(serverPair.PublicKeyZ85),因为加密不起作用。我想这和编码有关。最好将字节数组表示形式保存到某个文件并共享它:
File.WriteAllBytes("serverPublicKey.txt", serverPair.PublicKey);https://stackoverflow.com/questions/46723979
复制相似问题