SQL Server
SQL Server
SSL Server Example
See more Socket/SSL/TLS Examples
Demonstrates how to create an SSL socket for accepting connections. This example is *very* simple in that it will create an SSL socket for accepting a single connection. It will read a message from the client, send a reply, and exit.Chilkat SQL Server Downloads
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
DECLARE @hr int
DECLARE @iTmp0 int
-- Important: Do not use nvarchar(max). See the warning about using nvarchar(max).
DECLARE @sTmp0 nvarchar(4000)
DECLARE @success int
SELECT @success = 0
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
DECLARE @listenSslSocket int
EXEC @hr = sp_OACreate 'Chilkat.Socket', @listenSslSocket OUT
IF @hr <> 0
BEGIN
PRINT 'Failed to create ActiveX component'
RETURN
END
-- An SSL server needs a digital certificate. This example loads it from a PFX file.
-- Create an instance of a certificate store object, load a PFX file,
-- locate the certificate we need, and use it.
-- (a PFX file may contain more than one certificate.)
DECLARE @certStore int
EXEC @hr = sp_OACreate 'Chilkat.CertStore', @certStore OUT
-- The 1st argument is the filename, the 2nd arg is the
-- PFX file's password:
EXEC sp_OAMethod @certStore, 'LoadPfxFile', @success OUT, 'chilkat.pfx', 'test'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @certStore, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
RETURN
END
-- Find the certificate to be used for SSL:
DECLARE @jsonCN int
EXEC @hr = sp_OACreate 'Chilkat.JsonObject', @jsonCN OUT
EXEC sp_OAMethod @jsonCN, 'UpdateString', @success OUT, 'CN', 'example.com'
DECLARE @cert int
EXEC @hr = sp_OACreate 'Chilkat.Cert', @cert OUT
EXEC sp_OAMethod @certStore, 'FindCert', @success OUT, @jsonCN, @cert
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @certStore, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
EXEC @hr = sp_OADestroy @jsonCN
EXEC @hr = sp_OADestroy @cert
RETURN
END
-- Use the certificate:
EXEC sp_OAMethod @listenSslSocket, 'InitSslServer', @success OUT, @cert
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @listenSslSocket, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
EXEC @hr = sp_OADestroy @jsonCN
EXEC @hr = sp_OADestroy @cert
RETURN
END
-- Bind and listen on a port:
DECLARE @myPort int
SELECT @myPort = 8123
-- Allow for a max of 5 queued connect requests.
DECLARE @backLog int
SELECT @backLog = 5
EXEC sp_OAMethod @listenSslSocket, 'BindAndListen', @success OUT, @myPort, @backLog
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @listenSslSocket, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
EXEC @hr = sp_OADestroy @jsonCN
EXEC @hr = sp_OADestroy @cert
RETURN
END
-- If accepting an SSL/TLS connection, the SSL handshake is part of the connection
-- establishment process. This involves a few back-and-forth messages between the
-- client and server to establish algorithms and a shared key to create the secure
-- channel. The sending and receiving of these messages are governed by the
-- MaxReadIdleMs and MaxSendIdleMs properties. If these properties are set to 0
-- (and this is the default unless changed by your application), then the
-- AcceptNext can hang indefinitely during the SSL handshake process.
-- Make sure these properties are set to appropriate values before calling AcceptNext.
-- Set a 10 second max for waiting to read/write. This is for the SSL/TLS handshake establishment.
EXEC sp_OASetProperty @listenSslSocket, 'MaxReadIdleMs', 10000
EXEC sp_OASetProperty @listenSslSocket, 'MaxSendIdleMs', 10000
-- Accept a single client connection and establish the secure SSL/TLS channel:
DECLARE @maxWaitMillisec int
SELECT @maxWaitMillisec = 20000
DECLARE @clientSock int
EXEC @hr = sp_OACreate 'Chilkat.Socket', @clientSock OUT
EXEC sp_OAMethod @listenSslSocket, 'AcceptNext', @success OUT, @maxWaitMillisec, @clientSock
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @listenSslSocket, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
EXEC @hr = sp_OADestroy @jsonCN
EXEC @hr = sp_OADestroy @cert
EXEC @hr = sp_OADestroy @clientSock
RETURN
END
-- The client (in this example) is going to send a "Hello Server! -EOM-"
-- message. Read it:
DECLARE @receivedMsg nvarchar(4000)
EXEC sp_OAMethod @clientSock, 'ReceiveUntilMatch', @receivedMsg OUT, '-EOM-'
EXEC sp_OAGetProperty @clientSock, 'LastMethodSuccess', @iTmp0 OUT
IF @iTmp0 = 0
BEGIN
EXEC sp_OAGetProperty @clientSock, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
EXEC @hr = sp_OADestroy @jsonCN
EXEC @hr = sp_OADestroy @cert
EXEC @hr = sp_OADestroy @clientSock
RETURN
END
PRINT @receivedMsg
-- Send a "Hello Client! -EOM-" message:
EXEC sp_OAMethod @clientSock, 'SendString', @success OUT, 'Hello Client! -EOM-'
IF @success = 0
BEGIN
EXEC sp_OAGetProperty @clientSock, 'LastErrorText', @sTmp0 OUT
PRINT @sTmp0
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
EXEC @hr = sp_OADestroy @jsonCN
EXEC @hr = sp_OADestroy @cert
EXEC @hr = sp_OADestroy @clientSock
RETURN
END
-- Close the connection with the client
-- Wait a max of 20 seconds (20000 millsec)
EXEC sp_OAMethod @clientSock, 'Close', @success OUT, 20000
EXEC @hr = sp_OADestroy @listenSslSocket
EXEC @hr = sp_OADestroy @certStore
EXEC @hr = sp_OADestroy @jsonCN
EXEC @hr = sp_OADestroy @cert
EXEC @hr = sp_OADestroy @clientSock
END
GO