README.md in ssl_allow_cname-0.1.3 vs README.md in ssl_allow_cname-0.1.4
- old
+ new
@@ -1,6 +1,53 @@
-# SslAllowCname
+# ssl_allow_cname
-This adds an SSL parameter: 'allow_cname', which can be a string, regexp, or
-proc, or array of any of the preceding.
+`ssl_allow_cname` adds a parameter to Ruby's OpenSSL library: `allow_cname`.
-This is will be further documented in the future.
+This is for cases when you don't care about the host matching the CommonName or
+a SubjectAlternateName of a certificate (e.g., you've got other security
+measures), but surely don't want to turn off all peer verification.
+
+Here's an example:
+
+```ruby
+# This actually works, using the Ruby redis client's SSL support:
+
+redis = Redis.new(
+ # Say the other side of this connection has a certificate you've signed, but
+ # you don't care what VPS instance it ends on with an arbitrary IP.
+ url: 'rediss://198.199.120.202/',
+ ssl_params: {
+ # And you only trust yourself as a CA.
+ ca_file: '/etc/ssl/metermd/metermd-ca.crt',
+
+ # And the following cert has been signed by your CA, and the key's valid...
+ cert: OpenSSL::X509::Certificate.new(File.read('/etc/ssl/metermd/redis-client.crt')),
+ key: OpenSSL::PKey::RSA.new(File.read('/etc/ssl/metermd/redis-client.keydh')),
+
+ # You just care that you've authorized this certificate for this purpose,
+ # and rely on the security of your CA being legit.
+ allow_cname: 'redis-server'
+ }
+)
+```
+
+Using the `allow_cname` option disables host verification, but specifying
+`allow_cname: :match` will give you the same behavior as peer verification.
+When you don't specify `allow_cname`, everything works the same as out-of-the-
+box.
+
+The value passed to `allow_cname` can take a few forms:
+
+ * A `String`, which means the CommonName presented must exactly match what
+ you've specified.
+ * A `Regexp`, which will pass if it matches the CommonName of the peer
+ certificate.
+ * A `Proc`, which can accept either `(common_name)` or `(common_name, host)`
+ argument lists. Return `true` if you like it, false otherwise.
+ * The symbol `:match`, which accepts anything OpenSSL would've considered
+ valid.
+ * An `Array` of any of the above, which **operates in an OR, not AND,
+ fashion.**
+
+For simplicity, and to make it easier to not get wrong, `ssl_allow_cname` does
+not consider SubjectAlternateNames, just the first CommonName. If you're
+running your own CA, you'll be able to arrange this.