Question:
I'm attempting to get the SSL Server/Client example to work in .Net, but it appears as though the certificate is never sent as part of the handshake. Here is my code for the server and client...
Server:
class ChilkatServer
{
Chilkat.Socket listenSocket = new Chilkat.Socket();
Chilkat.CertStore cstore = null;
Chilkat.Cert cert = null;
bool success;
public ChilkatServer()
{
success = listenSocket.UnlockComponent("Give me 30 days!");
if (success != true)
{
Console.WriteLine(listenSocket.LastErrorText);
return;
}
}
public void RunServer(string cf, string cfp)
{
// Load the certificate store
cstore = new Chilkat.CertStore();
success = cstore.LoadPfxFile(cf, cfp);
if (success != true)
{
Console.WriteLine(cstore.LastErrorText);
return;
}
// Load the certificate
cert = cstore.GetCertificate(0);
if (cert == null)
{
Console.WriteLine(cstore.LastErrorText);
return;
}
success = listenSocket.InitSslServer(cert);
if (success != true)
{
Console.WriteLine(listenSocket.LastErrorText);
return;
}
int myPort = 8055;
int backLog = 5;
listenSocket.MaxReadIdleMs = 10000;
listenSocket.MaxSendIdleMs = 10000;
success = listenSocket.BindAndListen(myPort, backLog);
if (success != true)
{
Console.WriteLine(listenSocket.LastErrorText);
return;
}
int maxWaitMilli = 20000;
while (true)
{
Chilkat.Socket clientSocket = null;
clientSocket = listenSocket.AcceptNextConnection(maxWaitMilli);
if (clientSocket == null)
{
Console.WriteLine("Still waiting...");
continue;
}
else
{
Thread clientThread = new Thread(new ParameterizedThreadStart(ProcessClient));
clientThread.Start(clientSocket);
continue;
}
}
}
private void ProcessClient(object obj)
{
Chilkat.Socket client = (Chilkat.Socket)obj;
while (client.IsConnected)
{
string rcvdMessage;
rcvdMessage = client.ReceiveUntilMatch("<EOF>");
if (string.IsNullOrEmpty(rcvdMessage))
{
Console.WriteLine(client.LastErrorText);
}
else
{
Console.WriteLine("Received: " + rcvdMessage);
}
}
}
}
Client:
public class ChilkatClient
{
Chilkat.Socket socket = new Chilkat.Socket();
bool success;
bool ssl = true;
int maxWaitMilli = 20000;
string serverName;
int serverPort;
public delegate void MessageReceivedHandler(object sender, MessageReceivedEventArgs e);
public event MessageReceivedHandler OnMessageReceived;
public ChilkatClient(string server, int port)
{
success = socket.UnlockComponent("Give me 30 days!");
if (success != true)
{
Console.WriteLine(socket.LastErrorText);
return;
}
serverName = server;
serverPort = port;
}
public void StartClient()
{
// Set maximum timeouts for reading an writing (in millisec)
socket.MaxReadIdleMs = 20000;
socket.MaxSendIdleMs = 20000;
success = socket.Connect(serverName, serverPort, ssl, maxWaitMilli);
if (success != true)
{
Console.WriteLine(socket.LastErrorText);
return;
}
success = socket.SendString("Hello Server! <EOF>");
if (success == true)
{
Console.WriteLine("Sent 'Hello Server! <EOF>");
}
while(socket.IsConnected)
{
string rcvdMessage;
rcvdMessage = socket.ReceiveUntilMatch("<EOF>");
if (string.IsNullOrEmpty(rcvdMessage))
{
Console.WriteLine("No message received from server...");
continue;
}
else
{
if (OnMessageReceived != null)
{
OnMessageReceived(new object(), new MessageReceivedEventArgs() { Message = new Messaging.Message() { Body = rcvdMessage } });
}
}
}
}
}
socket.Connect fails with the following:
ChilkatLog:
Connect_Socket:
DllDate: Jun 10 2014
ChilkatVersion: 9.5.0.40
UnlockPrefix: Give me 30 days!
Username: myuname
Architecture: Little Endian; 64-bit
Language: .NET 4.5 / x64
VerboseLogging: 0
objectId: 1
Connect_Socket:
hostname: local.xyz.com
port: 8055
ssl: 1
maxWaitMs: 20000
socket2Connect:
connect2:
connectImplicitSsl:
clientHandshake:
clientHandshake2:
processHandshakeRecord:
processHandshakeMessage:
processIncomingCertificates:
Warning, no certificates were received!
--processIncomingCertificates
--processHandshakeMessage
--processHandshakeRecord
buildClientKeyExchange:
buildClientKeyExchangeRsa:
getServerCertPublicKey:
Certificate not available in TlsCertificates object.
Failed to get server certificate at index 0.
numServerCertsReceived: 0
--getServerCertPublicKey
--buildClientKeyExchangeRsa
--buildClientKeyExchange
Failed to build ClientKeyExchange
--clientHandshake2
--clientHandshake
Client handshake failed. (3)
--connectImplicitSsl
ConnectFailReason: 0
--connect2
--socket2Connect
Failed.
--Connect_Socket
--Connect_Socket --ChilkatLog
I think these new builds should fix it:
32-bit: http://www.chilkatsoft.com/download/preRelease/ChilkatDotNet45-9.5.0-win32.zip
64-bit: http://www.chilkatsoft.com/download/preRelease/ChilkatDotNet45-9.5.0-x64.zip
Thanks, I'll give them a shot.
Worked like a charm! Thanks!
I have problem. Can not loaded pfx file. I use chilkat library.
My error is: Failed to verify PFX HMAC with password.
ChilkatLog: LoadPfxFile: DllDate: Jun 12 2014 ChilkatVersion: 9.5.0.40 UnlockPrefix: NONE Username: TYMAJ_NTB:jtyma Architecture: Little Endian; 32-bit Language: .NET 2.0 VerboseLogging: 0 class: Cert pfxPath: C:\www-xdslCheck\spdsl_from_spd.pfx loadPfxData: addPfxSource: pkcs12_loadAndParseDer: loadAndParseDerInner: verifyHmacIntegrity: saltNumBytes: 20 saltBase64: wF7RxS3vZpjSowhNTatwQ7xqiYk= numIterations: 1 macHashOid: 1.3.14.3.2.26 macStoredDigest: 5CDF 5C70 1ED7 74E6 A2FA 5AFD E51D 80A1 64B3 7E95 Failed to verify PFX HMAC with password. computedDigest: 8126 6C3E 0964 45E7 9BF9 1115 1F5D 795F C2B7 F333 --verifyHmacIntegrity Retry with NULL password instead of zero-length password. verifyHmacIntegrity: saltNumBytes: 20 saltBase64: wF7RxS3vZpjSowhNTatwQ7xqiYk= numIterations: 1 macHashOid: 1.3.14.3.2.26 macStoredDigest: 5CDF 5C70 1ED7 74E6 A2FA 5AFD E51D 80A1 64B3 7E95 Password and HMAC verified. --verifyHmacIntegrity nContentInfos: 2 ContentInfo: loadPkcs7Xml: PKCS7 Data dataSize: 945 --loadPkcs7Xml PKCS7_DATA processSafeContents: SafeBagOid: 1.2.840.113549.1.12.10.1.2 Pkcs8ShroudedKeyBag processPkcs8ShroudedKeyBag: AlgorithmIdentifier_loadXml: PBE encryption. Salt: Lt3f8bcYUFg= Iterations: 2000 --AlgorithmIdentifier_loadXml numEncryptedBytes: 656 passwordDecryptData: decryptPkcs12: algorithm: des keyLength: 192 outputSize: 650 --decryptPkcs12 --passwordDecryptData --processPkcs8ShroudedKeyBag --processSafeContents --ContentInfo ContentInfo: loadPkcs7Xml: Pkcs7_EncryptedData: pkcs7_passwordDecrypt: AlgorithmIdentifier_loadXml: PBE encryption. Salt: YoILVI6uqxQ= Iterations: 2000 --AlgorithmIdentifier_loadXml numEncryptedBytes: 1528 passwordDecryptData: decryptPkcs12: algorithm: rc2 keyLength: 40 outputSize: 1524 --decryptPkcs12 --passwordDecryptData --pkcs7_passwordDecrypt --Pkcs7_EncryptedData --loadPkcs7Xml PKCS7_ENCRYPTED_DATA processSafeContents: SafeBagOid: 1.2.840.113549.1.12.10.1.3 CertBag processCertBag: cert_CN: sp-dsl.mobilkom.loc cert_E: adminit@ufon.cz cert_DN: CZ, Czech Republic, Prague, Air Telecom a.s., IT, sp-dsl.mobilkom.loc, adminit@ufon.cz serial: 5330FF9D000200000623 --processCertBag --processSafeContents --ContentInfo --loadAndParseDerInner populateWithKeys: numPrivateKeys: 1 --populateWithKeys --pkcs12_loadAndParseDer addPkcs12: numCerts: 1 --addPkcs12 --addPfxSource --loadPfxData Success. --LoadPfxFile --ChilkatLog
Chilkat.Cert cert = new Chilkat.Cert(); success = cert.LoadPfxFile(@"C:\www-xdslCheck\spdsl_from_spd.pfx","");
I use chilkat version 9.5.0.40.