- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在创建一个将调用 API 的 Windows 服务。对于这个过程,我正在尝试建立相互(双向)SSL 身份验证。因为我是新手。我尝试实现一个简单的客户端和服务器项目,它们将相互进行身份验证。
我已经创建了在受信任的证书中交换和添加的自签名证书。
我的客户
sử dụng Hệ thống;
using System.Configuration;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
sử dụng System.Text;
namespace MutualSslDemo.Client
{
class Program
{
void tĩnh Main(chuỗi[] args)
{
// hostName
var hostName = ConfigurationManager.AppSettings["hostName"];
if (String.IsNullOrEmpty(hostName))
throw new ArgumentNullException("hostName", "Please specify a valid hostname to connect to.");
// port
var port = Convert.ToInt32(ConfigurationManager.AppSettings["port"]);
if (port <= 0)
throw new ArgumentException("Please specify a valid port number.");
// certificate and password
var certificate = ConfigurationManager.AppSettings["certificate"];
var password = ConfigurationManager.AppSettings["password"];
var certificates = new X509Certificate2Collection(new X509Certificate2(certificate, password));
RunClient(hostName, port, certificates);
Console.ReadLine();
}
static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return (sslPolicyErrors == SslPolicyErrors.None);
}
static bool CertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors != SslPolicyErrors.None)
{
Console.WriteLine("Validation Error");
Console.WriteLine(sslPolicyErrors.ToString());
trả về false;
}
khác
trả về giá trị đúng;
}
static void RunClient(string hostName, int port, X509Certificate2Collection certificates)
{
// Create a TCP/IP client socket.
// machineName is the host running the server application.
TcpClient client = new TcpClient(hostName, port);
Console.WriteLine("Client connected.");
// Create an SSL stream that will close the client's stream.
SslStream sslStream = new SslStream(
client.GetStream(),
SAI,
new RemoteCertificateValidationCallback(CertificateValidationCallback));
// The server name must match the name on the server certificate.
thử
{
sslStream.AuthenticateAsClient(hostName, certificates, SslProtocols.Default, true);
Console.WriteLine("");
DisplaySecurityLevel(sslStream);
DisplaySecurityServices(sslStream);
DisplayCertificateInformation(sslStream);
DisplayStreamProperties(sslStream);
}
catch (AuthenticationException e)
{
Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
client.Close();
trở lại;
}
// Encode a test message into a byte array.
// Signal the end of the message using the "".
byte[] messsage = Encoding.UTF8.GetBytes("Hello from the client.");
// Send hello message to the server.
sslStream.Write(messsage);
sslStream.Flush();
// Read message from the server.
string serverMessage = ReadMessage(sslStream);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Server says: {0}", serverMessage);
Console.ResetColor();
// Close the client connection.
client.Close();
Console.WriteLine("Client closed.");
}
static string ReadMessage(SslStream sslStream)
{
// Read the message sent by the server.
// The end of the message is signaled using the
// "" marker.
byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
LÀM
{
bytes = sslStream.Read(buffer, 0, buffer.Length);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);
// Check for EOF.
if (messageData.ToString().IndexOf("") != -1)
{
phá vỡ;
}
} while (bytes != 0);
return messageData.ToString();
}
static void DisplaySecurityLevel(SslStream stream)
{
Console.WriteLine("Cipher: {0} strength {1}", stream.CipherAlgorithm, stream.CipherStrength);
Console.WriteLine("Hash: {0} strength {1}", stream.HashAlgorithm, stream.HashStrength);
Console.WriteLine("Key exchange: {0} strength {1}", stream.KeyExchangeAlgorithm, stream.KeyExchangeStrength);
Console.WriteLine("Protocol: {0}", stream.SslProtocol);
}
static void DisplaySecurityServices(SslStream stream)
{
Console.WriteLine("Is authenticated: {0} as server? {1}", stream.IsAuthenticated, stream.IsServer);
Console.WriteLine("IsSigned: {0}", stream.IsSigned);
Console.WriteLine("Is Encrypted: {0}", stream.IsEncrypted);
}
static void DisplayStreamProperties(SslStream stream)
{
Console.WriteLine("Can read: {0}, write {1}", stream.CanRead, stream.CanWrite);
Console.WriteLine("Can timeout: {0}", stream.CanTimeout);
}
static void DisplayCertificateInformation(SslStream stream)
{
Console.WriteLine("Certificate revocation list checked: {0}", stream.CheckCertRevocationStatus);
X509Certificate localCertificate = stream.LocalCertificate;
if (stream.LocalCertificate != null)
{
Console.WriteLine("Local cert was issued to {0} and is valid from {1} until {2}.",
localCertificate.Subject,
localCertificate.GetEffectiveDateString(),
localCertificate.GetExpirationDateString());
}
khác
{
Console.WriteLine("Local certificate is null.");
}
// Display the properties of the client's certificate.
X509Certificate remoteCertificate = stream.RemoteCertificate;
if (remoteCertificate != null)
{
Console.WriteLine("Remote cert was issued to {0} and is valid from {1} until {2}.",
remoteCertificate.Subject,
remoteCertificate.GetEffectiveDateString(),
remoteCertificate.GetExpirationDateString());
Console.WriteLine(remoteCertificate);
}
khác
{
Console.WriteLine("Remote certificate is null.");
}
}
}
}
我的服务器
sử dụng Hệ thống;
using System.Configuration;
using System.Net;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
sử dụng System.Text;
namespace MutualSslDemo.Server
{
class Program
{
void tĩnh Main(chuỗi[] args)
{
// port
var port = Convert.ToInt32(ConfigurationManager.AppSettings["port"]);
if (port <= 0)
throw new ArgumentException("Please specify a valid port number.");
// certificate and password
var fileName = ConfigurationManager.AppSettings["certificate"];
var password = ConfigurationManager.AppSettings["password"];
var certificate = new X509Certificate2(fileName, password);
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);
SslTcpServer.RunServer(port, certificate);
}
static bool OnRemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return (sslPolicyErrors == SslPolicyErrors.None);
}
public sealed class SslTcpServer
{
// The certificate parameter specifies the name of the file
// containing the machine certificate.
public static void RunServer(int serverPort, X509Certificate2 certificate)
{
// Create a TCP/IP (IPv4) socket and listen for incoming connections.
var listener = new TcpListener(IPAddress.Any, serverPort);
listener. Bắt đầu();
while (true)
{
Console.WriteLine("Waiting for a client to connect...");
// Application blocks while waiting for an incoming connection.
// Type CNTL-C to terminate the server.
var client = listener.AcceptTcpClient();
ProcessClient(client, certificate);
}
}
static void ProcessClient(TcpClient client, X509Certificate certificate)
{
// A client has connected. Create the
// SslStream using the client's network stream.
var sslStream = new SslStream(client.GetStream(), false);
thử
{
// Authenticate the server and requires the client to authenticate.
sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Default, true);
// Display the properties and settings for the authenticated stream.
DisplaySecurityLevel(sslStream);
DisplaySecurityServices(sslStream);
DisplayCertificateInformation(sslStream);
DisplayStreamProperties(sslStream);
// Set timeouts for the read and write to 5 seconds.
sslStream.ReadTimeout = 5000;
sslStream.WriteTimeout = 5000;
// Read a message from the client.
Console.WriteLine("Waiting for client message...");
string messageData = ReadMessage(sslStream);
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Received: {0}", messageData);
Console.ResetColor();
// Write a message to the client.
byte[] message = Encoding.UTF8.GetBytes("Hello from the server.");
Console.WriteLine("Sending hello message.");
sslStream.Write(message);
}
catch (AuthenticationException e)
{
Console.WriteLine("Exception: {0}", e.Message);
if (e.InnerException != null)
{
Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
}
Console.WriteLine("Authentication failed - closing the connection.");
sslStream.Close();
client.Close();
trở lại;
}
Cuối cùng
{
// The client stream will be closed with the sslStream
// because we specified this behavior when creating
// the sslStream.
sslStream.Close();
client.Close();
}
}
static string ReadMessage(SslStream sslStream)
{
// Read the message sent by the client.
// The client signals the end of the message using the
// "" marker.
byte[] buffer = new byte[2048];
StringBuilder messageData = new StringBuilder();
int bytes = -1;
LÀM
{
// Read the client's test message.
bytes = sslStream.Read(buffer, 0, buffer.Length);
// Use Decoder class to convert from bytes to UTF8
// in case a character spans two buffers.
Decoder decoder = Encoding.UTF8.GetDecoder();
char[] chars = new char[decoder.GetCharCount(buffer, 0, bytes)];
decoder.GetChars(buffer, 0, bytes, chars, 0);
messageData.Append(chars);
// Check for EOF or an empty message.
if (messageData.ToString().IndexOf("") != -1)
{
phá vỡ;
}
} while (bytes != 0);
return messageData.ToString();
}
static void DisplaySecurityLevel(SslStream stream)
{
Console.WriteLine("Cipher: {0} strength {1}", stream.CipherAlgorithm, stream.CipherStrength);
Console.WriteLine("Hash: {0} strength {1}", stream.HashAlgorithm, stream.HashStrength);
Console.WriteLine("Key exchange: {0} strength {1}", stream.KeyExchangeAlgorithm, stream.KeyExchangeStrength);
Console.WriteLine("Protocol: {0}", stream.SslProtocol);
}
static void DisplaySecurityServices(SslStream stream)
{
Console.WriteLine("Is authenticated: {0} as server? {1}", stream.IsAuthenticated, stream.IsServer);
Console.WriteLine("IsSigned: {0}", stream.IsSigned);
Console.WriteLine("Is Encrypted: {0}", stream.IsEncrypted);
}
static void DisplayStreamProperties(SslStream stream)
{
Console.WriteLine("Can read: {0}, write {1}", stream.CanRead, stream.CanWrite);
Console.WriteLine("Can timeout: {0}", stream.CanTimeout);
}
static void DisplayCertificateInformation(SslStream stream)
{
Console.WriteLine("Certificate revocation list checked: {0}", stream.CheckCertRevocationStatus);
X509Certificate localCertificate = stream.LocalCertificate;
if (stream.LocalCertificate != null)
{
Console.WriteLine("Local cert was issued to {0} and is valid from {1} until {2}.",
localCertificate.Subject,
localCertificate.GetEffectiveDateString(),
localCertificate.GetExpirationDateString());
}
khác
{
Console.WriteLine("Local certificate is null.");
}
// Display the properties of the client's certificate.
X509Certificate remoteCertificate = stream.RemoteCertificate;
if (remoteCertificate != null)
{
Console.WriteLine("Remote cert was issued to {0} and is valid from {1} until {2}.",
remoteCertificate.Subject,
remoteCertificate.GetEffectiveDateString(),
remoteCertificate.GetExpirationDateString());
}
khác
{
Console.WriteLine("Remote certificate is null.");
}
}
}
}
}
现在,如果我在本地 (localhost) 中同时运行服务器和客户端,这项工作就可以完成。但是,当我在两台不同的机器上(在网络 LAN 内)尝试这个时。它抛出错误
Exception: The remote certificate is invalid according to the validation procedure.
hiện hữu我的服务器这一行的代码中。
sslStream.AuthenticateAsServer(certificate, true, SslProtocols.Default, true);
hiện hữu我的客户端中,我注意到CertificateValidationCallback
返回ĐÚNG VẬY
但是我在DisplayCertificateInformation
中发现Local certificate is null
抱歉,我对 C# 和安全性都不熟悉。谁能帮我解决这个问题。提前致谢。
câu trả lời hay nhất
证书错误
static bool CertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
trả về giá trị đúng;
}
关于c# - 相互 SSL 身份验证 - sslstream 中的本地证书返回 'null' 而不是客户端上的证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27063745/
Điều tôi muốn làm là làm cho JTextPane chiếm nhiều dung lượng nhất có thể trong JPanel. Đối với UpdateInfoPanel tôi đang sử dụng: public class UpdateInfoPanel mở rộng JP
Tôi có JTextArea trong JPanel và tôi muốn sử dụng nó với JScrollPane. Tôi đang sử dụng GridBagLayout. Khi tôi chạy nó, khung công tác dường như nhường chỗ cho JScrollPane, nhưng
Tôi muốn triển khai chức năng sau trong xcode. Tôi có Trình điều khiển xem. Trong UIViewController này, tôi có UITabBar. Bên dưới chúng là UIView. Thay đổi UITab
Có ai biết Firebird 2.5 có chức năng tương tự chức năng "STUFF" trong SQL không? Tôi có một bảng chứa các bản ghi người dùng gốc và một bảng khác chứa các bản ghi người dùng con liên quan đến cha mẹ. Tôi muốn có thể trích xuất một chuỗi "ROLES" được phân tách bằng dấu phẩy do người dùng sở hữu, trong khi
Tôi muốn sử dụng JSON làm đầu vào và đầu ra của kênh phản ánh, chẳng hạn như lưu thông tin chi tiết trong cơ sở dữ liệu hoặc tạo thông báo HL7. Nói tóm lại, đầu vào là JSON, phân tích cú pháp và xuất ra bất kỳ định dạng nào. Đối tượng trả lời tốt nhất
Thông thường tôi sẽ sử dụng R và thực hiện merge.by, nhưng tệp này có vẻ quá lớn để bất kỳ máy tính nào trong bộ phận có thể xử lý nó! (Thông tin bổ sung cho bất kỳ ai làm việc trong lĩnh vực di truyền học) Về cơ bản, việc quy định dường như sẽ bị xóa Sau khi nhận được số rs của ID snp, tôi chỉ có
Tôi có một câu hỏi có thể đã được hỏi trước đây nhưng tôi gặp khó khăn khi tìm mô tả chính xác. Tôi hy vọng ai đó có thể giúp tôi. Trong đoạn mã bên dưới, tôi đã thiết lập varprice và tôi muốn thêm biến javascript accu_id để tra cứu bản ghi trong cơ sở dữ liệu của mình thông qua Rails
Tôi có một tệp SVG đơn giản có thể xem tốt trong Firefox - nó có một số văn bản gói chứa một số HTML bằng cách sử dụng đối tượng nước ngoài - văn bản được gói trong một div:
Vì vậy, tôi đang viết một chương trình Ruby dành cho trường học để thay đổi giá trị bool thành true nếu giá trị là 1 hoặc 3 và thành false nếu nó là 0 hoặc 2. Vì tôi có nền tảng Java nên tôi nghĩ mã này sẽ hoạt động:
Những gì tôi đã làm: Tôi đã tạo VPC ngang hàng giữa các tài khoản này Cổng Internet cũng được kết nối với từng VPC Bảng định tuyến cũng được định cấu hình (để cho phép lưu lượng truy cập từ cả hai phía) Trường hợp 1: Khi hai VPC này nằm trong cùng một tài khoản Trong thời gian chờ đợi, tôi đã thử nghiệm thành công nó từ một La khác
Tôi có một bảng gọi là danh bạ: user_id contact_id 10294 10295 10294 10293 10293 10294 102
Tôi đang sử dụng mẫu mới trong Magento. Để tránh trùng lặp mã, tôi muốn sử dụng cùng một mẫu con cho mỗi bản xem trước sản phẩm. Cụ thể là tôi đã tạo một màn hình như thế này: $products = Mage::getModel('catalog/pro
"for" có luôn kiểm tra loại tham số đầu tiên trong mọi hàm được xác định trong giao thức không? Chỉnh sửa (viết lại): Khi một phương thức giao thức chỉ có một tham số, việc triển khai được tìm thấy dựa trên loại tham số đơn đó (trực tiếp hoặc tùy ý). Khi thỏa thuận (p
Tôi muốn gọi hàm JavaScript từ mã PHP của mình. Tôi đã đạt được điều này bằng cách sử dụng: echo ' drawChart($id); '; Điều này hoạt động tốt, nhưng tôi muốn lấy dữ liệu từ mã PHP của mình, tôi sử dụng
Câu hỏi này đã có câu trả lời: Sự kiện ràng buộc trên các phần tử được tạo động? (23 câu trả lời) Đã đóng 5 năm trước. Tôi có một biểu mẫu động mà tôi muốn nối thêm một số h
Tôi đang cố gắng tìm giải pháp sử dụng setState trên các mục được ánh xạ trong thành phầnDidMount. Tôi đang sử dụng GraphQL cùng với Gatsby để trả về nhiều mục dữ liệu nhưng yêu cầu điều đó trong một thao tác cụ thể
Tôi có Chế độ xem bên trong ScrollView. Tôi muốn gọi phương thức này cứ sau 80 mili giây miễn là người dùng giữ Chế độ xem. Đây là những gì tôi đã thực hiện: rung Runnable cuối cùng = Runnab mới
Tôi đã phát triển một ứng dụng Android bằng jni. Tôi nhận được một dvmabort trong dvmDecodeIndirectRef của GetStringUTFChars. Tôi chỉ phá thai một lần. Tại sao điều này lại xảy ra?
Khi tôi truy cập Hoạt động của mình, tôi gọi FragmentPagerAdapter để xử lý các tab khác nhau của mình. Trong một trong các tab của mình, tôi muốn hiển thị RecyclerView nhưng anh ấy không bao giờ xuất hiện, với một điểm ngắt mà tôi thấy
Khi tôi nhấn một nút trong Hoạt động, DialogFragment sẽ bật lên. Trong đoạn hộp thoại, có một RecyclerView trông giống như một ListView bình thường. Hành vi tôi muốn là khi
Tôi là một lập trình viên xuất sắc, rất giỏi!