| Allegro CL version 9.0 Object described on page has changed in 9.0. 8.2 version |
Arguments: socket &key context method certificate key certificate-password method verify max-depth ca-file ca-directory ciphers crl-check crl-file
A patch released in April, 2014, added the context keyword argument to this function.
This function is not available in all versions. Generally, you must
have a Professional license to use this function. Also, you must have
the OpenSSL libraries installed for this facility to work. Note that
shared library versions of the OpenSSL libraries (required by Allegro
CL) are not available on all platforms. The SSL functionality is in
the ssl module. To ensure it is loaded, evaluate
(require :ssl)
. Calling this function automatically
loads the module.
This function creates and returns a new SSL server socket stream that communicates via SSL via the given socket. Once this function is called and an SSL socket stream is returned, no I/O calls should be done directly to socket. Note that closing the SSL socket stream will result in the original socket file descriptor being closed as well. Therefore, the idiomatic way to establish an SSL server socket stream is:
;; SOCK is already a socket: (setf sock (make-ssl-server-stream sock ...))
Unless ssl-do-handshake is called, the secure connection isn't negotiated until the first byte is sent through the SSL socket stream to the underlying stream (and this will usually occur when the first force-output is done to the SSL socket stream).
When that first write is done a negotiation process is begun that involves reads and writes. This negotiation process will not occur if the SSL socket on the other end of the connection is not sitting waiting for data to arrive. Thus if you create two connected sockets in a single Lisp process, and make one the client and the other the server, and then write to the client side the Lisp will hang since the server side socket isn't being read. You can make this work if you use the Lisp multiprocessing facility (see multiprocessing.htm) to cause the server socket to be read at the same time that the write to the client socket is being done.
The context keyword argument takes an SSL context object as a value. Such objects contain relevant information about the client stream being created. The function make-ssl-client-context create a context suitable for a client stream.
Note that if you supply an SSL context object as the value of context, you can specify values for the arguments method, ciphers, verify, and max-depth in the call to this function. Doing so causes the associated argument value to be local to the connection being created (i.e. the specified argument value overrides the value in the context object). However, it is an error to specify values for the arguments certificate, key, ca-file, ca-directory, certificate-password, crl-file, and crl-check. Those arguments cannot be overridden when a context is provided.
If an error occurs, a condition of
type excl::ssl-error
is signaled. This condition
has slots what (a string indicating what internal operation was being
performed when the error occurred), codes (a ist of numeric OpenSSL
error codes that represented the accumulated errors that resulted in
the final error), strings (a list of the corresponding string forms of
the OpenSSL error codes in the 'codes' slot) and verify-result, and
verify-result-string. The last two will be populated if possible when
an ssl error occurs. If non-nil, this information is included in the
printed representation of the condition. This aids recognizing and
debugging certificate-related SSL errors.
make-ssl-client-stream's keyword arguments are the same as make-ssl-server-stream's. The keyword arguments to make-ssl-client-stream are:
:sslv23
(the default): the client will initiate SSL
handshake using SSLv2 and will advertise that it can handle SSLv2,
SSLv3, and TLSv1. The highest protocol version that is common between
the client and server will be selected. This method allows for best
compatibility.
:sslv2
: the client will initiate SSL handshake using
SSLv2 and will advertise that it can only speak SSLv2. This option is
not recommended as SSLv2 has known security issues (such as
susceptibility to man In the middle attacks).
:sslv3
: the client will initiate SSL handshake using
SSLv3 and will advertise that it can only speak SSLv3.
:sslv3+
: this is the same as :sslv23 except that,
after handshake, if the selected protocol is SSLv2, an error will be
generated. This option allows for high handshake compabitility while
avoiding communication under the deprecated SSLv2 protocol.
:tlsv1
: the client will initiate SSL handshake using
TLSv1 and will advertise that it can only speak TLSv1.
nil
, :optional
, or
:required
. Due to the way OpenSSL is implemented,
the behavior of peer verification differs for clients and
servers. Here we describe the behavior for clients. See make-ssl-server-stream for a
discussion of the server behavior.
For details on the cipher list format, see the CIPHER LIST FORMAT section of http://www.openssl.org/docs/apps/ciphers.html.
nil
(the default) for no CRL
checking, t
for CRL checking of the peer's
certificate (if provided by the peer), or :all
for
CRL checking of all components of the peer's supplied certificate
chain. If this argument is non-nil
, the
verify argument must also be non-nil
. If you
enable CRL checking, you must supply a proper PEM-encoded CRL,
even if it contains zero revocations. If you do not supply a CRL,
peer verification will never succeed.
nil
or
not supplied, defaults to the value of
the ca-file argument (if supplied). It is
acceptable for CRL to be included amongst other PEM-encoded
certificates.
See make-ssl-server-stream. See also socket.htm for information on sockets. For information on Secure Sockets, see the section Secure Socket Layer (SSL) in that document.
Copyright (c) 1998-2019, Franz Inc. Oakland, CA., USA. All rights reserved.
The object described on this page has been modified in the 9.0 release; see the Release Notes.
Created 2019.8.20.
| Allegro CL version 9.0 Object described on page has changed in 9.0. 8.2 version |