Return to README CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / openssl |
1.1 ! misho 1: OpenSSL extension for PHP ! 2: ! 3: $Id: README 242949 2007-09-26 15:44:16Z cvs2svn $ ! 4: ! 5: The functions implemented so far make it possible to seal and open data, and ! 6: also create and verify signatures. ! 7: ! 8: NEW: support for S/MIME encrypt/decrypt/sign/verify, as well as more ! 9: flexibility for specifying certificates/keys. ! 10: ! 11: To enable the extension, configure PHP with --with-openssl. ! 12: ! 13: Specifying keys/certificates ! 14: ---------------------------- ! 15: ! 16: Most of the functions require a key or a certificate as a parameter; to make ! 17: things easy for you to use openssl, this extension allows you ! 18: to specify certificates in the following way: ! 19: ! 20: 1. As an X.509 resource returned from openssl_x509_read ! 21: 2. As a string in the format file://filename, where filename is the path to the ! 22: certificate file (it will be opened and read automatically) ! 23: 3. As a string containing the data from the certificate file ! 24: ! 25: Similarly, you can use the following methods of specifying a public key: ! 26: ! 27: 1. As a key resource returned from openssl_get_publickey ! 28: 2. An X509 resource - public key only ! 29: 3. As a string in the format file://filename ! 30: 4. As a string containing the data from the key file ! 31: ! 32: Additionally, for a private key, when the openssl extension function does not ! 33: allow you to enter the passphrase as a parameter you may use the syntax ! 34: array($key, "passphrase") where $key can be a key specified using one of the ! 35: methods listed above. ! 36: ! 37: Certificate Verification ! 38: ------------------------ ! 39: When calling a function that will verify a signature/certificate, the cainfo ! 40: parameter is an array containing file and directory names that specifiy the ! 41: locations of trusted CA files. If a directory is specified, then it must be a ! 42: correctly hashed directory. ! 43: ! 44: Misc: ! 45: ----- ! 46: ! 47: mixed openssl_error_string() ! 48: ! 49: returns the message from the last error that the OpenSSL library encountered ! 50: and moves it's internal error pointer to the next message. If there are no ! 51: more error messages, returns false. ! 52: ! 53: General Key/Cert Functions: ! 54: --------------------------- ! 55: ! 56: resource openssl_get_privatekey(mixed key [, string passphrase]) ! 57: ! 58: Parses the key data and returns a key resource identifier. If the key is ! 59: encrypted a passphrase is needed. This can be supplied as second argument. ! 60: ! 61: ! 62: resource openssl_get_publickey(mixed cert) ! 63: ! 64: Extracts the public key from the given certificate or public key and returns ! 65: a key resource identifier. ! 66: ! 67: ! 68: void openssl_free_key(resource key) ! 69: ! 70: Frees the resource given by the key resource identifier. ! 71: Note that this function does not accept the extended key specification ! 72: syntax mentioned above, as it doesn't make sense in this case! ! 73: ! 74: array openssl_x509_parse(mixed x509[, bool shortnames=true]) ! 75: ! 76: Parses the certificate data and returns an array containing information ! 77: about the certificate, it's intended purposes, subject, issuer, validity ! 78: etc. etc. If shortnames is true (the default) then the fields will be ! 79: keyed by the shortname forms eg: CN as opposed to commonName (shortnames ! 80: = false). ! 81: ! 82: ! 83: bool openssl_x509_checkpurpose(mixed x509cert, int purpose, ! 84: array cainfo[, string untrustedfile]) ! 85: ! 86: Verifies if the certificate can be used for a specific purpose. ! 87: Purpose can be one of the following values: ! 88: X509_PURPOSE_SSL_CLIENT ! 89: X509_PURPOSE_SSL_SERVER ! 90: X509_PURPOSE_NS_SSL_SERVER ! 91: X509_PURPOSE_SMIME_SIGN ! 92: X509_PURPOSE_SMIME_ENCRYPT ! 93: X509_PURPOSE_CRL_SIGN ! 94: X509_PURPOSE_ANY ! 95: ! 96: cainfo is an array of CA information (as mentioned above). ! 97: untrusted file specifies a file containing a bunch of certs that ! 98: are not trusted but may be useful in validating the certificate. ! 99: ! 100: ! 101: resource openssl_read_x509(mixed cert) ! 102: ! 103: Parses the cert and returns a resource that can be used with the ! 104: other openssl functions ! 105: ! 106: ! 107: void openssl_free_x509(resource x509) ! 108: ! 109: Frees the resource given by the x509 resource identifier. ! 110: Note that this function does not accept the extended cert specification ! 111: syntax mentioned above, as it doesn't make sense in this case! ! 112: ! 113: ! 114: PKCS7 (S/MIME) Sign/Verify/Encrypt/Decrypt Functions: ! 115: ----------------------------------------------------- ! 116: ! 117: These functions allow you to manipulate S/MIME messages! ! 118: ! 119: They are based on apps/smime.c from the openssl dist, so for information, ! 120: see the documentation for openssl. ! 121: ! 122: You may pass in some flags that affect how these functions work using ! 123: and array containing the following values: ! 124: "detached", "nodetached", "text", "nointern", "noverify", "nochain", ! 125: "nocerts", "noattr", "binary", "nosigs". ! 126: The options correspond to the options of the same name for the ! 127: "openssl smime" command (smime(1)). ! 128: ! 129: ! 130: bool openssl_pkcs7_verify(string filename, array flags[, string signerscerts][, ! 131: array cainfo]) ! 132: ! 133: Verifies that the signature on the MIME message contained in the file ! 134: named by filename is valid. If signerscerts is passed in, it holds the ! 135: name of a file into which the certificates of those that signed the ! 136: message will be stored. ! 137: cainfo and flags are CA information and flag information as described ! 138: above. ! 139: ! 140: ! 141: bool openssl_pkcs7_encrypt(string infile, string outfile, array recipcerts, ! 142: array headers[, array flags]) ! 143: ! 144: Encrypts the MIME message contained in the file named by infile using ! 145: the certificates held in recipcerts. The result is place in the file ! 146: named outfile. ! 147: recipcerts is an array of certificate identifiers representing the certs ! 148: of the intended recipients of the message. ! 149: headers is an array of headers to prepend to the message: they will ! 150: not be included in the encoded section. ! 151: flags is flag information as described above. ! 152: Hint: you will want to put "To", "From", and "Subject" headers in headers. ! 153: Headers can be either an assoc array keyed by header named, or can be ! 154: and indexed array containing a single header line per value. ! 155: The message will be encoded using a RC2-40 bit cipher. ! 156: TODO: allow user to specify cipher. ! 157: ! 158: bool openssl_pkcs7_sign(string infile, string outfile, mixed signcert, mixed ! 159: signkey, array headers[, array flags][, string extracertsfilename]) ! 160: ! 161: Signs the MIME message contained in the file named by infile using the ! 162: certificate and key pair identified by signcert/signkey. ! 163: Signkey must be the private key corresponding to signcert. ! 164: The result is placed in the file named by outfile. ! 165: Headers and flags have the same effects as mentioned above. ! 166: extracertsfilename names a file containing a bunch of additional certificates ! 167: to include in the signature, in order to aid the recipient in verifying the ! 168: message. ! 169: ! 170: ! 171: bool openssl_pkcs7_decrypt(string infilename, string outfilename, mixed ! 172: recipcert, mixed recipkey) ! 173: ! 174: Decrypts the MIME message contained in the file named by infilename ! 175: using the certificate and private key pair recipcert/recipkey. ! 176: The descrypted result is placed in outfilename. ! 177: TODO: add flags parameter, if needed? ! 178: ! 179: ! 180: EVP Sign/Verify/Encrypt/Decrypt Functions: ! 181: ------------------------------------------ ! 182: ! 183: bool openssl_sign(string data, &string signature, mixed key) ! 184: ! 185: Uses key to create signature for data, returns true on success and false ! 186: on failure. signature is passed by reference and contains the newly created ! 187: signature on success. ! 188: ! 189: ! 190: int openssl_verify(string data, string signature, mixed key) ! 191: ! 192: Uses key to verify that the signature is correct for the given data. ! 193: Returns 1 if correct, 0 if incorrect, and -1 on error. ! 194: ! 195: ! 196: int openssl_seal(string data, &string sealdata, &array ekeys, array pubkeys) ! 197: ! 198: Encrypts data using pubkeys, so that only owners of the respective private ! 199: keys and ekeys can decrypt and read the data. Returns the length of the ! 200: sealed data on success, else false. On success, sealdata and ekeys hold ! 201: the sealed data and envelope keys. ! 202: ! 203: ! 204: bool openssl_open(string data, &string opendata, string ekey, int privkey) ! 205: ! 206: Opens (decrypts) sealed data using a private key and the corresponding ! 207: envelope key. Returns true on success and false on failure. On success, ! 208: opendata will hold the descypted data. ! 209: ! 210: ! 211: See below for more details on usage. Also feel free to mail me at ! 212: venaas@php.net if you have questions. The OpenSSL documentation, ! 213: especially the EVP documentation at ! 214: http://www.openssl.org/docs/crypto/evp.html, might also be of help. ! 215: ! 216: ! 217: HOWTO: ! 218: ! 219: To do anything you need a private key and a certificate containing the ! 220: corresponding public key. This is similar to what you have using say an ! 221: Apache webserver with OpenSSL. For testing you could try keys that come ! 222: with OpenSSL, that's what the sample scripts below do. You can also get ! 223: keys from some CA, or you can create them yourself. ! 224: ! 225: ! 226: Creating private key ! 227: ! 228: To generate an unprotected 1024 bit RSA private key you can do ! 229: ! 230: openssl genrsa -out /tmp/test.key 1024 ! 231: ! 232: Private keys should be protected by a passphrase though. ! 233: ! 234: ! 235: Creating a self signed certificate ! 236: ! 237: To generate a self signed certificate from the key that is valid for ! 238: 365 days, do ! 239: ! 240: openssl req -new -key /tmp/test.key -out /tmp/test.crt -days 365 -x509 ! 241: ! 242: ! 243: Example usage ! 244: ! 245: These examples use keys that come with OpenSSL, you should perhaps test with ! 246: those first. ! 247: ! 248: ! 249: Seal and open ! 250: ! 251: <?php ! 252: $data = "Follow the white rabbit"; ! 253: ! 254: // Get certificate into a string ! 255: // this file comes with OpenSSL 0.9.6 ! 256: $fp = fopen("/src/openssl-0.9.6/demos/maurice/cert.pem", "r"); ! 257: $cert = fread($fp, 8192); ! 258: fclose($fp); ! 259: // get public key from certificate ! 260: $pk1 = openssl_get_publickey($cert); ! 261: // $pk1 is an encryption key resource id if success, else false ! 262: // Repeat if want public keys for multiple parties ! 263: ! 264: $fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r"); ! 265: $cert = fread($fp, 8192); ! 266: fclose($fp); ! 267: $pk2 = openssl_get_publickey($cert); ! 268: ! 269: // seal data, only owners of $pk1 and $pk2 can decrypt $sealed with keys ! 270: // $ekeys[0] and $ekeys[1] respectively. ! 271: openssl_seal($data, $sealed, $ekeys, array($pk1,$pk2)); ! 272: openssl_free_key($pk1); ! 273: openssl_free_key($pk2); ! 274: ! 275: // now we try to decrypt data for one of the recipients ! 276: $fp = fopen("/src/openssl-0.9.6/demos/sign/key.pem", "r"); ! 277: // Get PEM coded key into $pkey ! 278: $pkey = fread($fp, 8192); ! 279: fclose($fp); ! 280: // $key will be resource id for unpacked $pkey ! 281: $key = openssl_get_privatekey($pkey); ! 282: ! 283: openssl_open($sealed, $open, $ekeys[1], $key); ! 284: openssl_free_key($key); ! 285: echo "$open\n"; ! 286: ?> ! 287: ! 288: ! 289: Sign and verify ! 290: ! 291: <?php ! 292: $data = "Follow the white rabbit"; ! 293: ! 294: // First we need to have a string containing the private key in PEM format ! 295: // this file comes with OpenSSL 0.9.6 ! 296: $fp = fopen("/src/openssl-0.9.6/demos/sign/key.pem", "r"); ! 297: $pkey = fread($fp, 8192); ! 298: fclose($fp); ! 299: ! 300: // get private key from the PEM format ! 301: // $key is an encr key resource id if success, else false ! 302: $key = openssl_get_privatekey($pkey); ! 303: ! 304: // calculate signature ! 305: openssl_sign($data, $signature, $key); ! 306: openssl_free_key($key); ! 307: ! 308: // recipient verifies signature ! 309: // read certificate ! 310: $fp = fopen("/src/openssl-0.9.6/demos/sign/cert.pem", "r"); ! 311: $cert = fread($fp, 8192); ! 312: fclose($fp); ! 313: ! 314: // Get public key from the certificate ! 315: $pubkey = openssl_get_publickey($cert); ! 316: ! 317: // state whether signature is okay or not ! 318: echo openssl_verify($data, $signature, $pubkey) == 1 ? "ok\n" : "bad\n"; ! 319: ! 320: // free key ! 321: openssl_free_key($pubkey); ! 322: ?>