SSL/TLS Alert Protocol & the Alert Codes
There have been many occasions where a event corresponding to SChannel is logged in the System event logs which indicates a problem with the SSL/TLS handshake and many a times depicts a number. The logging mechanism is a part of the SSL/TLS Alert Protocol. These alerts are used to notify peers of the normal and error conditions. The numbers especially, play a trivial role in understanding the problem/failure with the SSL/TLS handshake.
SChannel logging may have to be enabled on the windows machines to get detailed SChannel messages. Please refer the following article to do so: https://support.microsoft.com/kb/260729
Below is an example of one such event:
Log Name: System Source: Schannel Date: x/xx/xxxx x:xx:xx Event ID: 36887 Task Category: None Level: Error Keywords: User: SYSTEM Computer: xxxxxxx Description: The following fatal alert was received: 47. |
These warnings sometimes are very helpful in troubleshooting SSL related issues and provide important clues. However, there is not much documentation available on the description of the alert codes.
These alert codes have been defined precisely in TLS/SSL RFC’s for all the existing protocol versions. For example lets consider the RFC 5246 (TLS 1.2). This RFC corresponds to the latest protocol version and it defines the alert messages.
Follow this link: https://tools.ietf.org/html/rfc5246#appendix-A.3
Below is a snippet from the above RFC describing the various alert messages:
A.3 . Alert Messages enum { warning(1), fatal(2), (255) } AlertLevel; enum { close_notify(0), unexpected_message(10), bad_record_mac(20), decryption_failed_RESERVED(21), record_overflow(22), decompression_failure(30), handshake_failure(40), no_certificate_RESERVED(41), bad_certificate(42), unsupported_certificate(43), certificate_revoked(44), certificate_expired(45), certificate_unknown(46), illegal_parameter(47), unknown_ca(48), access_denied(49), decode_error(50), decrypt_error(51), export_restriction_RESERVED(60), protocol_version(70), insufficient_security(71), internal_error(80), user_canceled(90), no_renegotiation(100), unsupported_extension(110), /* new */ (255) } AlertDescription; struct { AlertLevel level; AlertDescription description; } Alert; |
There is MSDN article which describes these messages more briefly. Here is the link: https://technet.microsoft.com/en-us/library/cc783349%28v=ws.10%29.aspx.
However, the article never mentions the alert codes while explaining the messages. For simplicity, I have created a simpler table combining both the MSDN documentation and the RFC for usability. Below is the table:
Alert Code |
Alert Message |
Description |
0 |
close_notify |
Notifies the recipient that the sender will not send any more messages on this connection. |
10 |
unexpected_message |
Received an inappropriate message This alert should never be observed in communication between proper implementations. This message is always fatal. |
20 |
bad_record_mac |
Received a record with an incorrect MAC. This message is always fatal. |
21 |
decryption_failed |
Decryption of a TLSCiphertext record is decrypted in an invalid way: either it was not an even multiple of the block length or its padding values, when checked, were not correct. This message is always fatal. |
22 |
record_overflow |
Received a TLSCiphertext record which had a length more than 2^14+2048 bytes, or a record decrypted to a TLSCompressed record with more than 2^14+1024 bytes. This message is always fatal. |
30 |
decompression_failure |
Received improper input, such as data that would expand to excessive length, from the decompression function. This message is always fatal. |
40 |
handshake_failure |
Indicates that the sender was unable to negotiate an acceptable set of security parameters given the options available. This is a fatal error. |
42 |
bad_certificate |
There is a problem with the certificate, for example, a certificate is corrupt, or a certificate contains signatures that cannot be verified. |
43 |
unsupported_certificate |
Received an unsupported certificate type. |
44 |
certificate_revoked |
Received a certificate that was revoked by its signer. |
45 |
certificate_expired |
Received a certificate has expired or is not currently valid. |
46 |
certificate_unknown |
An unspecified issue took place while processing the certificate that made it unacceptable. |
47 |
illegal_parameter |
Violated security parameters, such as a field in the handshake was out of range or inconsistent with other fields. This is always fatal. |
48 |
unknown_ca |
Received a valid certificate chain or partial chain, but the certificate was not accepted because the CA certificate could not be located or could not be matched with a known, trusted CA. This message is always fatal. |
49 |
access_denied |
Received a valid certificate, but when access control was applied, the sender did not proceed with negotiation. This message is always fatal. |
50 |
decode_error |
A message could not be decoded because some field was out of the specified range or the length of the message was incorrect. This message is always fatal. |
51 |
decrypt_error |
Failed handshake cryptographic operation, including being unable to correctly verify a signature, decrypt a key exchange, or validate a finished message. |
60 |
export_restriction |
Detected a negotiation that was not in compliance with export restrictions; for example, attempting to transfer a 1024 bit ephemeral RSA key for the RSA_EXPORT handshake method. This message is always fatal. |
70 |
protocol_version |
The protocol version the client attempted to negotiate is recognized, but not supported. For example, old protocol versions might be avoided for security reasons. This message is always fatal. |
71 |
insufficient_security |
Failed negotiation specifically because the server requires ciphers more secure than those supported by the client. Returned instead of handshake_failure. This message is always fatal. |
80 |
internal_error |
An internal error unrelated to the peer or the correctness of the protocol makes it impossible to continue, such as a memory allocation failure. The error is not related to protocol. This message is always fatal. |
90 |
user_cancelled |
Cancelled handshake for a reason that is unrelated to a protocol failure. If the user cancels an operation after the handshake is complete, just closing the connection by sending a close_notify is more appropriate. This alert should be followed by a close_notify. This message is generally a warning. |
100 |
no_renegotiation |
Sent by the client in response to a hello request or sent by the server in response to a client hello after initial handshaking. Either of these would normally lead to renegotiation; when that is not appropriate, the recipient should respond with this alert; at that point, the original requester can decide whether to proceed with the connection. One case where this would be appropriate would be where a server has spawned a process to satisfy a request; the process might receive security parameters (key length, authentication, and so on) at start-up and it might be difficult to communicate changes to these parameters after that point. This message is always a warning. |
255 |
unsupported_extension |
|
There were few articles that I found while searching that contain additional alert codes. However, I don’t find these to be part of the RFC. Here is one: https://botan.randombit.net/doxygen/classBotan_1_1TLS_1_1Alert.html
It includes additional alerts like 110, 111, 112, 113, 114, 115. You can browse the above link for further reading.
Hope someone finds the above table useful. It may not help you in solving any issue but would provide useful pointers.
Until then, Ciao!
Comments
Anonymous
April 03, 2013
Thanks for combing those together. A very useful table for understanding what the specific codes really mean! :-)Anonymous
January 19, 2014
How do you fix #48? I have a CA key installed.Anonymous
January 19, 2014
Could you provide more detail? what is the error? #48 is not about having the CA key installed. Its about verifying the CA, a simple comparison of the CA cert part of the certificate chain to the CA cert present in the corresponding certificate stores.Anonymous
March 06, 2014
I'm actually receiving error 42 and 43 while the user is connected via usb ethernet. When i disable his usb ethernet and connect through wifi he is fine. Any ideas?Anonymous
March 23, 2014
Good information, but still unanswered questions. When this event is logged why does it not include the name of the cert with the issue and the client presenting the cert?Anonymous
March 27, 2014
@Mike I'm assuming that there was an issue with the users certificate. However, this is a guess based on the response. I'm not entirely sure. You may wanna take up this question in the Certificates discussion forums of Microsoft. @Craig I couldn't agree with you more. One reason I can think of is that most of the times when there is a schannel failure the certificate information is not available and hence it is not logged. Also parsing through a certificate requires certain amount of processing which will incurr compute cost on the logging per say. I guess the developers did a trade off here to save processing time.Anonymous
July 02, 2014
We have a problem with error #46 on a IIS server. Any idea how to troubleshoot this issue? (Our IIS serversseems to have a problem with receiving requests from another server, since no requests are logged and error #46 is logged in the event log).Anonymous
July 02, 2014
@Anders The description is really not helping me to provide you any suggestions. The site on your server to which the other server connects to should have a SSL cert I believe. Is the SSL cert installed on the site issued by a internal CA or a public CA. Is the cert trusted which implies is the issuer of the cert trusted by both your server and the client (in this case the other server) This is typically seen in Client Certificate Authentication. Are you using client certificate Auth for the site?Anonymous
August 15, 2014
Verry good article. Now you only need to read this Post for Server 2008 & 2011: www.techieshelp.com/how-to-enable-ssl-3-0-server-2008-sbs-2008 Greets CarstenAnonymous
September 01, 2014
Hi Carsten, Thanks for your comment. I would suggest you to go through this support.microsoft.com/.../245030 It is more in detail than the link you shared. Another things is that disabling and enabling of protocols is done via registry which remains consistent throughout different version of windows. You may copy the registry from a older version to a newer version. NOTE: I'm only referring to the registry keys corresponding to enabling and disabling of SSL protocols. The registry keys do change from an older version to a newer version. Please be careful while migrating registry keys, as it can put the OS in an unstable state.Anonymous
November 11, 2014
This article is useless without an explanation of what to do when the errors occur!!Anonymous
November 19, 2014
I like the article, but it does not mention any further RFCs. Alert 115 for example is used for PSK key exchange, which is described in RFC 4279 ( www.ietf.org/.../rfc4279.txt ). Note, that RFC 5246 does not cover all possibilities of TLS 1.2.Anonymous
March 11, 2015
Hi, How do you fix #40 (Handshake fatal error)? Thanks.Anonymous
July 01, 2015
How do you fix #20 (A fatal alert was generated and sent to the remote endpoint. This may result in termination of the connection. The TLS protocol defined fatal error code is 20. The Windows SChannel error state is 960.) thank in advanceAnonymous
July 06, 2015
@George In this case I will gather a TCP dump from client and server and enable logging on either client/server depending on where the message was seen. In case of Windows Server I will enable SChannel logging.Anonymous
July 08, 2015
I have #49 repeatedly filling logs, no idea what the problem isAnonymous
July 08, 2015
Server is Windows Server 2012 R2 and keeps registering the schannel error 49 I am not running IIS it's just a file server, how can I determine cause and resolve this issue?Anonymous
July 13, 2015
The comment has been removedAnonymous
July 26, 2015
@Mark, 49 for a File server sounds tricky. I would suggest you to get a support ticket logged for this and have Microsoft support take a look at this. @Jivach Looks there are compatibility issues with one of the clients trying to connect to the server. If you have access to the client, then capture a end to end network trace and review it to see what parameters are being passed in client hello by that client.Anonymous
September 27, 2015
I am getting lots of 49 errors on my workstation, and wonder if there is a way to find out what machine is causing the error. Are you able to find what machine the communication is with?Anonymous
November 05, 2015
Hi, anyone ever seen lots of 70 errors on an Exchange 2010 CAS? getting loads of these throughout the day, we have also noticed that Outlook Anywhere users get randomly disconnected, but dont know if this is just a red herringAnonymous
January 03, 2016
I am getting message type id 128. i dont find any description for 128.Anonymous
April 01, 2016
THank you very much received error 45, and your article helped me to solve thisAnonymous
May 23, 2016
Only get the SChannel 36887 error when I remove a service account from the Administrator group. Otherwise the ssl/tls handshake works. Problem is, I cannot have the service account in the Administrator group for Security reasons.Anonymous
August 22, 2016
Thanks for this great collection in human friendly form.Anonymous
October 05, 2016
Kaushal,I originally had a DC (DC02) configured as the root CA in my environment. I forgot about this DC role and I recently configured my second DC (DC01) as another root CA using a different key SHA256. When I noticed that my DC02 has already the root CA configured, I uninstalled the CA role on that DC and re-installed that role but as a subordinate CA requesting the certificate from the parent DC01.Since this change, I'm receiving the TLS fatal error #48 and I don't know what I have to do to fix it. It's probably related to the old original root Ca that I didn't properly uninstalled...any Idea?ThanksAnonymous
October 09, 2016
Awesome man! thanks a lot for your deep info!Anonymous
April 20, 2017
UDTS 36887 Error Schannel System 20/04/2017 18:47:55how to remove this error please suggestAnonymous
June 20, 2017
40 how to fix- Anonymous
June 26, 2017
@Rakesh. You will have to debug this further to determine what caused the handshake to fail. You can start by gather network traces via Wireshark.
- Anonymous