The default purposes/extensions on the SSL certificates and keys created by Puppetca prohibits their use for SMIME (file) encryption. We could leverage the existing key infrastructure to expand into file encryption were this available.
The following patch updates the certificate creation policy to allow SMIME use.
--- /usr/lib/ruby/1.8/puppet/sslcertificates.rb.orig 2008-02-21
04:07:30.000000000 -0600
+++ /usr/lib/ruby/1.8/puppet/sslcertificates.rb 2008-02-21
04:13:37.000000000 -0600
@@ -61,7 +61,7 @@
when :server:
basic_constraint = "CA:FALSE"
key_usage = %w{digitalSignature keyEncipherment}
- ext_key_usage = %w{serverAuth clientAuth}
+ ext_key_usage = %w{serverAuth clientAuth emailProtection}
when :ocsp:
basic_constraint = "CA:FALSE"
key_usage = %w{nonRepudiation digitalSignature}
SSL File encryption can then occur using the following commands:
Setup keys:
/usr/sbin/puppetca --generate signer
/usr/sbin/puppetca --generate node
Encrypt:
openssl smime -encrypt -des3 -binary -nodetach \
-CAfile .puppet/ssl/ca/ca_crt.pem \
-in file -out file.encrypted \
.puppet/ssl/certs/node.pem
Sign:
openssl smime -sign -des3 -binary -nodetach \
-CAfile .puppet/ssl/ca/ca_crt.pem \
-signer .puppet/ssl/certs/signer.pem \
-inkey .puppet/ssl/private_keys/signer.pem \
-in file -out file.signed
Encrypt & Sign:
openssl smime -encrypt -sign -des3 -binary -nodetach \
-CAfile .puppet/ssl/ca/ca_crt.pem \
-signer .puppet/ssl/certs/signer.pem \
-inkey .puppet/ssl/private_keys/signer.pem \
-in file -out file.both \
.puppet/ssl/certs/node.pem
Verify a signature:
openssl smime -verify \
-CAfile .puppet/ssl/ca/ca_crt.pem \
-signer .puppet/ssl/certs/signer.pem \
-in file.signed -out file
Decrypt a file:
openssl smime -decrypt \
-CAfile .puppet/ssl/ca/ca_crt.pem \
-recip .puppet/ssl/certs/node.pem \
-inkey .puppet/ssl/private_keys/node.pem \
-in file.encrypted -out file
Decrypt & Verify:
openssl smime -decrypt -verify \
-CAfile .puppet/ssl/ca/ca_crt.pem \
-signer .puppet/ssl/certs/signer.pem \
-recip .puppet/ssl/certs/node.pem \
-inkey .puppet/ssl/private_keys/node.pem \
-in file.both -out file
Verify a key signed by CA:
openssl verify -CAfile .puppet/ssl/ca/ca_crt.pem .puppet/ssl/ca/signed/signer.pem
Examine a key:
openssl x509 -text -purpose -in key.pem