Re: SSL peer certificate validation failed:unsupported certificate purpose

From: Derek Gransaull <derek@xxxxxxxxxxx>
To: mongodb-user <mongodb-user@xxxxxxxxxxxxxxxx>
Date: Mon, 2 May 2016 23:31:13 -0700 (PDT)
Why ads?
This helped me. It's a pity the Mongo Docs are so sparse and, in this case, 
likely incorrect. I had tried with both clientAuth and serverAuth like the 
docs say, but that didn't work either. The only way it works is as you've 
said ... with no extensions. Thanks Micheal! 

On Monday, March 21, 2016 at 12:56:46 PM UTC-7, Micheal Shallop wrote:

Hey - for anyone else with similar issues, here's the solution...

When creating your certs, normally one would specify if the cert being 
generated as a server or a client certificate.  In order to get mongodb to 
work with SSL, you have to generate the (server and client) certs omitting 
the [ server | client ] parameter option.

For example:

openssl ca -config intermediate/openssl.cnf \
      -extensions server_cert -days 375 -notext -md sha256 \
      -in intermediate/csr/www.example.com.csr.pem \
      -out intermediate/certs/www.example.com.cert.pem


Would be:

openssl ca -config intermediate/openssl.cnf \
      -days 375 -notext -md sha256 \
      -in intermediate/csr/www.example.com.csr.pem \
      -out intermediate/certs/www.example.com.cert.pem


instead.

Hope this helps someone else....

--mike


On Tuesday, January 26, 2016 at 4:22:45 PM UTC-8, Micheal Shallop wrote:

Trying to set-up SSL/TLS for a replication set.

Carefully generated and signed root, intermediate, and server certs.  All 
verified.  Server certs verified against the chain cert.  Chain cert 
verified against the root cert.

Took extra care in setting up the DNs for all the certs at all levels. 
 All nodes are defined in /etc/hosts and the node names match the CN in the 
server cert DNs.

Intermediate cert CN does not match the root cert CN.

The repl-set is solid - it connects and repls all day normally.  Until I 
add the SSL...

My mongod.conf ssl section:

    ssl:
        mode:                       requireSSL
        PEMKeyFile:                 /etc/ssl/mongo-prod1.pem
        CAFile:                     /etc/ssl/ca-chain.cert.pem
        PEMKeyPassword:             xxxxxxxxxxxxxxxx
        allowConnectionsWithoutCertificates:  true

Where the mongo-prod[1-3].pem key files contain the server key + the 
server cert cat'd into a single file...


When I attempt to enable SSL/TLS is when things blow-up and throw 
exceptions, most of which are similar to:

Tue Jan 26 16:13:52.588 E NETWORK  [conn8070] SSL peer certificate 
validation failed:unsupported certificate purpose
Tue Jan 26 16:13:52.588 W -        [conn8070] DBException thrown :: 
caused by :: 9001 socket exception [CONNECT_ERROR] for
Tue Jan 26 16:13:52.593 I -        [conn8070]
 0xf82712 0xf03fbd 0x857bce 0xf42da1 0xf3b302 0xf31181 0xf33c40 
0x7f5875e66182 0x7f587492d47d


When I built the server certs, I was very careful to specify the -extensions 
server_cert flag.  My cert validation dumps show:

        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Cert Type: 
                SSL Server
            Netscape Comment: 
                OpenSSL Generated Server Certificate
            X509v3 Subject Key Identifier: 
                F1:85:92:F6:9E:6F:DD:F8:11:52:CA:FA:45:34:A3:A1:E6:EF:BC:
E7
            X509v3 Authority Key Identifier: 
                keyid:A1:F5:E5:61:EE:CF:46:93:5A:2B:76:DA:E6:9E:DE:40:18:
41:9F:25
                DirName:/C=US/ST=California/O=PathwayGenomics
                serial:10:01


            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage: 
                TLS Web Server Authentication

output from rs.status():

ULPROD:SECONDARY> rs.status()
{
 "set" : "ULPROD",
 "date" : ISODate("2016-01-27T00:08:21.917Z"),
 "myState" : 2,
 "members" : [
 {
 "_id" : 0,
 "name" : "mongo-prod1:27017",
 "health" : 1,
 "state" : 2,
 "stateStr" : "SECONDARY",
 "uptime" : 2400,
 "optime" : Timestamp(1453333325, 28),
 "optimeDate" : ISODate("2016-01-20T23:42:05Z"),
 "configVersion" : 3,
 "self" : true
 },
 {
 "_id" : 1,
 "name" : "mongo-prod2:27017",
 "health" : 0,
 "state" : 8,
 "stateStr" : "(not reachable/healthy)",
 "uptime" : 0,
 "optime" : Timestamp(0, 0),
 "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
 "lastHeartbeat" : ISODate("2016-01-27T00:08:19.749Z"),
 "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
 "configVersion" : -1
 },
 {
 "_id" : 2,
 "name" : "mongo-prod3:27017",
 "health" : 0,
 "state" : 8,
 "stateStr" : "(not reachable/healthy)",
 "uptime" : 0,
 "optime" : Timestamp(0, 0),
 "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
 "lastHeartbeat" : ISODate("2016-01-27T00:08:19.923Z"),
 "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
 "configVersion" : -1
 }
 ],
 "ok" : 1
}


My mongo client alias:

alias mongo='mongo --ssl --sslAllowInvalidHostnames --sslCAFile 
/etc/ssl/ca-chain.cert.pem --host mongo-prod1'



Thanks for listening... hope someone has encountered this before and can 
steer me to a better path.

--mike



-- 
You received this message because you are subscribed to the Google Groups "mongodb-user"
group.

For other MongoDB technical support options, see: https://docs.mongodb.org/manual/support/
--- 
You received this message because you are subscribed to the Google Groups "mongodb-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user+unsubscribe@xxxxxxxxxxxxxxxx.
To post to this group, send email to mongodb-user@xxxxxxxxxxxxxxxx.
Visit this group at https://groups.google.com/group/mongodb-user.
To view this discussion on the web visit https://groups.google.com/d/msgid/mongodb-user/7d6a466c-9fe6-4f45-b5dd-51012556fa03%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Why ads?