Annotation of embedaddon/php/ext/openssl/README, revision 1.1
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: ?>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>