1 | sshpk
|
---|
2 | =========
|
---|
3 |
|
---|
4 | Parse, convert, fingerprint and use SSH keys (both public and private) in pure
|
---|
5 | node -- no `ssh-keygen` or other external dependencies.
|
---|
6 |
|
---|
7 | Supports RSA, DSA, ECDSA (nistp-\*) and ED25519 key types, in PEM (PKCS#1,
|
---|
8 | PKCS#8) and OpenSSH formats.
|
---|
9 |
|
---|
10 | This library has been extracted from
|
---|
11 | [`node-http-signature`](https://github.com/joyent/node-http-signature)
|
---|
12 | (work by [Mark Cavage](https://github.com/mcavage) and
|
---|
13 | [Dave Eddy](https://github.com/bahamas10)) and
|
---|
14 | [`node-ssh-fingerprint`](https://github.com/bahamas10/node-ssh-fingerprint)
|
---|
15 | (work by Dave Eddy), with additions (including ECDSA support) by
|
---|
16 | [Alex Wilson](https://github.com/arekinath).
|
---|
17 |
|
---|
18 | Install
|
---|
19 | -------
|
---|
20 |
|
---|
21 | ```
|
---|
22 | npm install sshpk
|
---|
23 | ```
|
---|
24 |
|
---|
25 | Examples
|
---|
26 | --------
|
---|
27 |
|
---|
28 | ```js
|
---|
29 | var sshpk = require('sshpk');
|
---|
30 |
|
---|
31 | var fs = require('fs');
|
---|
32 |
|
---|
33 | /* Read in an OpenSSH-format public key */
|
---|
34 | var keyPub = fs.readFileSync('id_rsa.pub');
|
---|
35 | var key = sshpk.parseKey(keyPub, 'ssh');
|
---|
36 |
|
---|
37 | /* Get metadata about the key */
|
---|
38 | console.log('type => %s', key.type);
|
---|
39 | console.log('size => %d bits', key.size);
|
---|
40 | console.log('comment => %s', key.comment);
|
---|
41 |
|
---|
42 | /* Compute key fingerprints, in new OpenSSH (>6.7) format, and old MD5 */
|
---|
43 | console.log('fingerprint => %s', key.fingerprint().toString());
|
---|
44 | console.log('old-style fingerprint => %s', key.fingerprint('md5').toString());
|
---|
45 | ```
|
---|
46 |
|
---|
47 | Example output:
|
---|
48 |
|
---|
49 | ```
|
---|
50 | type => rsa
|
---|
51 | size => 2048 bits
|
---|
52 | comment => foo@foo.com
|
---|
53 | fingerprint => SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w
|
---|
54 | old-style fingerprint => a0:c8:ad:6c:32:9a:32:fa:59:cc:a9:8c:0a:0d:6e:bd
|
---|
55 | ```
|
---|
56 |
|
---|
57 | More examples: converting between formats:
|
---|
58 |
|
---|
59 | ```js
|
---|
60 | /* Read in a PEM public key */
|
---|
61 | var keyPem = fs.readFileSync('id_rsa.pem');
|
---|
62 | var key = sshpk.parseKey(keyPem, 'pem');
|
---|
63 |
|
---|
64 | /* Convert to PEM PKCS#8 public key format */
|
---|
65 | var pemBuf = key.toBuffer('pkcs8');
|
---|
66 |
|
---|
67 | /* Convert to SSH public key format (and return as a string) */
|
---|
68 | var sshKey = key.toString('ssh');
|
---|
69 | ```
|
---|
70 |
|
---|
71 | Signing and verifying:
|
---|
72 |
|
---|
73 | ```js
|
---|
74 | /* Read in an OpenSSH/PEM *private* key */
|
---|
75 | var keyPriv = fs.readFileSync('id_ecdsa');
|
---|
76 | var key = sshpk.parsePrivateKey(keyPriv, 'pem');
|
---|
77 |
|
---|
78 | var data = 'some data';
|
---|
79 |
|
---|
80 | /* Sign some data with the key */
|
---|
81 | var s = key.createSign('sha1');
|
---|
82 | s.update(data);
|
---|
83 | var signature = s.sign();
|
---|
84 |
|
---|
85 | /* Now load the public key (could also use just key.toPublic()) */
|
---|
86 | var keyPub = fs.readFileSync('id_ecdsa.pub');
|
---|
87 | key = sshpk.parseKey(keyPub, 'ssh');
|
---|
88 |
|
---|
89 | /* Make a crypto.Verifier with this key */
|
---|
90 | var v = key.createVerify('sha1');
|
---|
91 | v.update(data);
|
---|
92 | var valid = v.verify(signature);
|
---|
93 | /* => true! */
|
---|
94 | ```
|
---|
95 |
|
---|
96 | Matching fingerprints with keys:
|
---|
97 |
|
---|
98 | ```js
|
---|
99 | var fp = sshpk.parseFingerprint('SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w');
|
---|
100 |
|
---|
101 | var keys = [sshpk.parseKey(...), sshpk.parseKey(...), ...];
|
---|
102 |
|
---|
103 | keys.forEach(function (key) {
|
---|
104 | if (fp.matches(key))
|
---|
105 | console.log('found it!');
|
---|
106 | });
|
---|
107 | ```
|
---|
108 |
|
---|
109 | Usage
|
---|
110 | -----
|
---|
111 |
|
---|
112 | ## Public keys
|
---|
113 |
|
---|
114 | ### `parseKey(data[, format = 'auto'[, options]])`
|
---|
115 |
|
---|
116 | Parses a key from a given data format and returns a new `Key` object.
|
---|
117 |
|
---|
118 | Parameters
|
---|
119 |
|
---|
120 | - `data` -- Either a Buffer or String, containing the key
|
---|
121 | - `format` -- String name of format to use, valid options are:
|
---|
122 | - `auto`: choose automatically from all below
|
---|
123 | - `pem`: supports both PKCS#1 and PKCS#8
|
---|
124 | - `ssh`: standard OpenSSH format,
|
---|
125 | - `pkcs1`, `pkcs8`: variants of `pem`
|
---|
126 | - `rfc4253`: raw OpenSSH wire format
|
---|
127 | - `openssh`: new post-OpenSSH 6.5 internal format, produced by
|
---|
128 | `ssh-keygen -o`
|
---|
129 | - `dnssec`: `.key` file format output by `dnssec-keygen` etc
|
---|
130 | - `putty`: the PuTTY `.ppk` file format (supports truncated variant without
|
---|
131 | all the lines from `Private-Lines:` onwards)
|
---|
132 | - `options` -- Optional Object, extra options, with keys:
|
---|
133 | - `filename` -- Optional String, name for the key being parsed
|
---|
134 | (eg. the filename that was opened). Used to generate
|
---|
135 | Error messages
|
---|
136 | - `passphrase` -- Optional String, encryption passphrase used to decrypt an
|
---|
137 | encrypted PEM file
|
---|
138 |
|
---|
139 | ### `Key.isKey(obj)`
|
---|
140 |
|
---|
141 | Returns `true` if the given object is a valid `Key` object created by a version
|
---|
142 | of `sshpk` compatible with this one.
|
---|
143 |
|
---|
144 | Parameters
|
---|
145 |
|
---|
146 | - `obj` -- Object to identify
|
---|
147 |
|
---|
148 | ### `Key#type`
|
---|
149 |
|
---|
150 | String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`.
|
---|
151 |
|
---|
152 | ### `Key#size`
|
---|
153 |
|
---|
154 | Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus;
|
---|
155 | for ECDSA this is the bit size of the curve in use.
|
---|
156 |
|
---|
157 | ### `Key#comment`
|
---|
158 |
|
---|
159 | Optional string, a key comment used by some formats (eg the `ssh` format).
|
---|
160 |
|
---|
161 | ### `Key#curve`
|
---|
162 |
|
---|
163 | Only present if `this.type === 'ecdsa'`, string containing the name of the
|
---|
164 | named curve used with this key. Possible values include `nistp256`, `nistp384`
|
---|
165 | and `nistp521`.
|
---|
166 |
|
---|
167 | ### `Key#toBuffer([format = 'ssh'])`
|
---|
168 |
|
---|
169 | Convert the key into a given data format and return the serialized key as
|
---|
170 | a Buffer.
|
---|
171 |
|
---|
172 | Parameters
|
---|
173 |
|
---|
174 | - `format` -- String name of format to use, for valid options see `parseKey()`
|
---|
175 |
|
---|
176 | ### `Key#toString([format = 'ssh])`
|
---|
177 |
|
---|
178 | Same as `this.toBuffer(format).toString()`.
|
---|
179 |
|
---|
180 | ### `Key#fingerprint([algorithm = 'sha256'[, hashType = 'ssh']])`
|
---|
181 |
|
---|
182 | Creates a new `Fingerprint` object representing this Key's fingerprint.
|
---|
183 |
|
---|
184 | Parameters
|
---|
185 |
|
---|
186 | - `algorithm` -- String name of hash algorithm to use, valid options are `md5`,
|
---|
187 | `sha1`, `sha256`, `sha384`, `sha512`
|
---|
188 | - `hashType` -- String name of fingerprint hash type to use, valid options are
|
---|
189 | `ssh` (the type of fingerprint used by OpenSSH, e.g. in
|
---|
190 | `ssh-keygen`), `spki` (used by HPKP, some OpenSSL applications)
|
---|
191 |
|
---|
192 | ### `Key#createVerify([hashAlgorithm])`
|
---|
193 |
|
---|
194 | Creates a `crypto.Verifier` specialized to use this Key (and the correct public
|
---|
195 | key algorithm to match it). The returned Verifier has the same API as a regular
|
---|
196 | one, except that the `verify()` function takes only the target signature as an
|
---|
197 | argument.
|
---|
198 |
|
---|
199 | Parameters
|
---|
200 |
|
---|
201 | - `hashAlgorithm` -- optional String name of hash algorithm to use, any
|
---|
202 | supported by OpenSSL are valid, usually including
|
---|
203 | `sha1`, `sha256`.
|
---|
204 |
|
---|
205 | `v.verify(signature[, format])` Parameters
|
---|
206 |
|
---|
207 | - `signature` -- either a Signature object, or a Buffer or String
|
---|
208 | - `format` -- optional String, name of format to interpret given String with.
|
---|
209 | Not valid if `signature` is a Signature or Buffer.
|
---|
210 |
|
---|
211 | ### `Key#createDiffieHellman()`
|
---|
212 | ### `Key#createDH()`
|
---|
213 |
|
---|
214 | Creates a Diffie-Hellman key exchange object initialized with this key and all
|
---|
215 | necessary parameters. This has the same API as a `crypto.DiffieHellman`
|
---|
216 | instance, except that functions take `Key` and `PrivateKey` objects as
|
---|
217 | arguments, and return them where indicated for.
|
---|
218 |
|
---|
219 | This is only valid for keys belonging to a cryptosystem that supports DHE
|
---|
220 | or a close analogue (i.e. `dsa`, `ecdsa` and `curve25519` keys). An attempt
|
---|
221 | to call this function on other keys will yield an `Error`.
|
---|
222 |
|
---|
223 | ## Private keys
|
---|
224 |
|
---|
225 | ### `parsePrivateKey(data[, format = 'auto'[, options]])`
|
---|
226 |
|
---|
227 | Parses a private key from a given data format and returns a new
|
---|
228 | `PrivateKey` object.
|
---|
229 |
|
---|
230 | Parameters
|
---|
231 |
|
---|
232 | - `data` -- Either a Buffer or String, containing the key
|
---|
233 | - `format` -- String name of format to use, valid options are:
|
---|
234 | - `auto`: choose automatically from all below
|
---|
235 | - `pem`: supports both PKCS#1 and PKCS#8
|
---|
236 | - `ssh`, `openssh`: new post-OpenSSH 6.5 internal format, produced by
|
---|
237 | `ssh-keygen -o`
|
---|
238 | - `pkcs1`, `pkcs8`: variants of `pem`
|
---|
239 | - `rfc4253`: raw OpenSSH wire format
|
---|
240 | - `dnssec`: `.private` format output by `dnssec-keygen` etc.
|
---|
241 | - `options` -- Optional Object, extra options, with keys:
|
---|
242 | - `filename` -- Optional String, name for the key being parsed
|
---|
243 | (eg. the filename that was opened). Used to generate
|
---|
244 | Error messages
|
---|
245 | - `passphrase` -- Optional String, encryption passphrase used to decrypt an
|
---|
246 | encrypted PEM file
|
---|
247 |
|
---|
248 | ### `generatePrivateKey(type[, options])`
|
---|
249 |
|
---|
250 | Generates a new private key of a certain key type, from random data.
|
---|
251 |
|
---|
252 | Parameters
|
---|
253 |
|
---|
254 | - `type` -- String, type of key to generate. Currently supported are `'ecdsa'`
|
---|
255 | and `'ed25519'`
|
---|
256 | - `options` -- optional Object, with keys:
|
---|
257 | - `curve` -- optional String, for `'ecdsa'` keys, specifies the curve to use.
|
---|
258 | If ECDSA is specified and this option is not given, defaults to
|
---|
259 | using `'nistp256'`.
|
---|
260 |
|
---|
261 | ### `PrivateKey.isPrivateKey(obj)`
|
---|
262 |
|
---|
263 | Returns `true` if the given object is a valid `PrivateKey` object created by a
|
---|
264 | version of `sshpk` compatible with this one.
|
---|
265 |
|
---|
266 | Parameters
|
---|
267 |
|
---|
268 | - `obj` -- Object to identify
|
---|
269 |
|
---|
270 | ### `PrivateKey#type`
|
---|
271 |
|
---|
272 | String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`.
|
---|
273 |
|
---|
274 | ### `PrivateKey#size`
|
---|
275 |
|
---|
276 | Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus;
|
---|
277 | for ECDSA this is the bit size of the curve in use.
|
---|
278 |
|
---|
279 | ### `PrivateKey#curve`
|
---|
280 |
|
---|
281 | Only present if `this.type === 'ecdsa'`, string containing the name of the
|
---|
282 | named curve used with this key. Possible values include `nistp256`, `nistp384`
|
---|
283 | and `nistp521`.
|
---|
284 |
|
---|
285 | ### `PrivateKey#toBuffer([format = 'pkcs1'])`
|
---|
286 |
|
---|
287 | Convert the key into a given data format and return the serialized key as
|
---|
288 | a Buffer.
|
---|
289 |
|
---|
290 | Parameters
|
---|
291 |
|
---|
292 | - `format` -- String name of format to use, valid options are listed under
|
---|
293 | `parsePrivateKey`. Note that ED25519 keys default to `openssh`
|
---|
294 | format instead (as they have no `pkcs1` representation).
|
---|
295 |
|
---|
296 | ### `PrivateKey#toString([format = 'pkcs1'])`
|
---|
297 |
|
---|
298 | Same as `this.toBuffer(format).toString()`.
|
---|
299 |
|
---|
300 | ### `PrivateKey#toPublic()`
|
---|
301 |
|
---|
302 | Extract just the public part of this private key, and return it as a `Key`
|
---|
303 | object.
|
---|
304 |
|
---|
305 | ### `PrivateKey#fingerprint([algorithm = 'sha256'])`
|
---|
306 |
|
---|
307 | Same as `this.toPublic().fingerprint()`.
|
---|
308 |
|
---|
309 | ### `PrivateKey#createVerify([hashAlgorithm])`
|
---|
310 |
|
---|
311 | Same as `this.toPublic().createVerify()`.
|
---|
312 |
|
---|
313 | ### `PrivateKey#createSign([hashAlgorithm])`
|
---|
314 |
|
---|
315 | Creates a `crypto.Sign` specialized to use this PrivateKey (and the correct
|
---|
316 | key algorithm to match it). The returned Signer has the same API as a regular
|
---|
317 | one, except that the `sign()` function takes no arguments, and returns a
|
---|
318 | `Signature` object.
|
---|
319 |
|
---|
320 | Parameters
|
---|
321 |
|
---|
322 | - `hashAlgorithm` -- optional String name of hash algorithm to use, any
|
---|
323 | supported by OpenSSL are valid, usually including
|
---|
324 | `sha1`, `sha256`.
|
---|
325 |
|
---|
326 | `v.sign()` Parameters
|
---|
327 |
|
---|
328 | - none
|
---|
329 |
|
---|
330 | ### `PrivateKey#derive(newType)`
|
---|
331 |
|
---|
332 | Derives a related key of type `newType` from this key. Currently this is
|
---|
333 | only supported to change between `ed25519` and `curve25519` keys which are
|
---|
334 | stored with the same private key (but usually distinct public keys in order
|
---|
335 | to avoid degenerate keys that lead to a weak Diffie-Hellman exchange).
|
---|
336 |
|
---|
337 | Parameters
|
---|
338 |
|
---|
339 | - `newType` -- String, type of key to derive, either `ed25519` or `curve25519`
|
---|
340 |
|
---|
341 | ## Fingerprints
|
---|
342 |
|
---|
343 | ### `parseFingerprint(fingerprint[, options])`
|
---|
344 |
|
---|
345 | Pre-parses a fingerprint, creating a `Fingerprint` object that can be used to
|
---|
346 | quickly locate a key by using the `Fingerprint#matches` function.
|
---|
347 |
|
---|
348 | Parameters
|
---|
349 |
|
---|
350 | - `fingerprint` -- String, the fingerprint value, in any supported format
|
---|
351 | - `options` -- Optional Object, with properties:
|
---|
352 | - `algorithms` -- Array of strings, names of hash algorithms to limit
|
---|
353 | support to. If `fingerprint` uses a hash algorithm not on
|
---|
354 | this list, throws `InvalidAlgorithmError`.
|
---|
355 | - `hashType` -- String, the type of hash the fingerprint uses, either `ssh`
|
---|
356 | or `spki` (normally auto-detected based on the format, but
|
---|
357 | can be overridden)
|
---|
358 | - `type` -- String, the entity this fingerprint identifies, either `key` or
|
---|
359 | `certificate`
|
---|
360 |
|
---|
361 | ### `Fingerprint.isFingerprint(obj)`
|
---|
362 |
|
---|
363 | Returns `true` if the given object is a valid `Fingerprint` object created by a
|
---|
364 | version of `sshpk` compatible with this one.
|
---|
365 |
|
---|
366 | Parameters
|
---|
367 |
|
---|
368 | - `obj` -- Object to identify
|
---|
369 |
|
---|
370 | ### `Fingerprint#toString([format])`
|
---|
371 |
|
---|
372 | Returns a fingerprint as a string, in the given format.
|
---|
373 |
|
---|
374 | Parameters
|
---|
375 |
|
---|
376 | - `format` -- Optional String, format to use, valid options are `hex` and
|
---|
377 | `base64`. If this `Fingerprint` uses the `md5` algorithm, the
|
---|
378 | default format is `hex`. Otherwise, the default is `base64`.
|
---|
379 |
|
---|
380 | ### `Fingerprint#matches(keyOrCertificate)`
|
---|
381 |
|
---|
382 | Verifies whether or not this `Fingerprint` matches a given `Key` or
|
---|
383 | `Certificate`. This function uses double-hashing to avoid leaking timing
|
---|
384 | information. Returns a boolean.
|
---|
385 |
|
---|
386 | Note that a `Key`-type Fingerprint will always return `false` if asked to match
|
---|
387 | a `Certificate` and vice versa.
|
---|
388 |
|
---|
389 | Parameters
|
---|
390 |
|
---|
391 | - `keyOrCertificate` -- a `Key` object or `Certificate` object, the entity to
|
---|
392 | match this fingerprint against
|
---|
393 |
|
---|
394 | ## Signatures
|
---|
395 |
|
---|
396 | ### `parseSignature(signature, algorithm, format)`
|
---|
397 |
|
---|
398 | Parses a signature in a given format, creating a `Signature` object. Useful
|
---|
399 | for converting between the SSH and ASN.1 (PKCS/OpenSSL) signature formats, and
|
---|
400 | also returned as output from `PrivateKey#createSign().sign()`.
|
---|
401 |
|
---|
402 | A Signature object can also be passed to a verifier produced by
|
---|
403 | `Key#createVerify()` and it will automatically be converted internally into the
|
---|
404 | correct format for verification.
|
---|
405 |
|
---|
406 | Parameters
|
---|
407 |
|
---|
408 | - `signature` -- a Buffer (binary) or String (base64), data of the actual
|
---|
409 | signature in the given format
|
---|
410 | - `algorithm` -- a String, name of the algorithm to be used, possible values
|
---|
411 | are `rsa`, `dsa`, `ecdsa`
|
---|
412 | - `format` -- a String, either `asn1` or `ssh`
|
---|
413 |
|
---|
414 | ### `Signature.isSignature(obj)`
|
---|
415 |
|
---|
416 | Returns `true` if the given object is a valid `Signature` object created by a
|
---|
417 | version of `sshpk` compatible with this one.
|
---|
418 |
|
---|
419 | Parameters
|
---|
420 |
|
---|
421 | - `obj` -- Object to identify
|
---|
422 |
|
---|
423 | ### `Signature#toBuffer([format = 'asn1'])`
|
---|
424 |
|
---|
425 | Converts a Signature to the given format and returns it as a Buffer.
|
---|
426 |
|
---|
427 | Parameters
|
---|
428 |
|
---|
429 | - `format` -- a String, either `asn1` or `ssh`
|
---|
430 |
|
---|
431 | ### `Signature#toString([format = 'asn1'])`
|
---|
432 |
|
---|
433 | Same as `this.toBuffer(format).toString('base64')`.
|
---|
434 |
|
---|
435 | ## Certificates
|
---|
436 |
|
---|
437 | `sshpk` includes basic support for parsing certificates in X.509 (PEM) format
|
---|
438 | and the OpenSSH certificate format. This feature is intended to be used mainly
|
---|
439 | to access basic metadata about certificates, extract public keys from them, and
|
---|
440 | also to generate simple self-signed certificates from an existing key.
|
---|
441 |
|
---|
442 | Notably, there is no implementation of CA chain-of-trust verification, and only
|
---|
443 | very minimal support for key usage restrictions. Please do the security world
|
---|
444 | a favour, and DO NOT use this code for certificate verification in the
|
---|
445 | traditional X.509 CA chain style.
|
---|
446 |
|
---|
447 | ### `parseCertificate(data, format)`
|
---|
448 |
|
---|
449 | Parameters
|
---|
450 |
|
---|
451 | - `data` -- a Buffer or String
|
---|
452 | - `format` -- a String, format to use, one of `'openssh'`, `'pem'` (X.509 in a
|
---|
453 | PEM wrapper), or `'x509'` (raw DER encoded)
|
---|
454 |
|
---|
455 | ### `createSelfSignedCertificate(subject, privateKey[, options])`
|
---|
456 |
|
---|
457 | Parameters
|
---|
458 |
|
---|
459 | - `subject` -- an Identity, the subject of the certificate
|
---|
460 | - `privateKey` -- a PrivateKey, the key of the subject: will be used both to be
|
---|
461 | placed in the certificate and also to sign it (since this is
|
---|
462 | a self-signed certificate)
|
---|
463 | - `options` -- optional Object, with keys:
|
---|
464 | - `lifetime` -- optional Number, lifetime of the certificate from now in
|
---|
465 | seconds
|
---|
466 | - `validFrom`, `validUntil` -- optional Dates, beginning and end of
|
---|
467 | certificate validity period. If given
|
---|
468 | `lifetime` will be ignored
|
---|
469 | - `serial` -- optional Buffer, the serial number of the certificate
|
---|
470 | - `purposes` -- optional Array of String, X.509 key usage restrictions
|
---|
471 |
|
---|
472 | ### `createCertificate(subject, key, issuer, issuerKey[, options])`
|
---|
473 |
|
---|
474 | Parameters
|
---|
475 |
|
---|
476 | - `subject` -- an Identity, the subject of the certificate
|
---|
477 | - `key` -- a Key, the public key of the subject
|
---|
478 | - `issuer` -- an Identity, the issuer of the certificate who will sign it
|
---|
479 | - `issuerKey` -- a PrivateKey, the issuer's private key for signing
|
---|
480 | - `options` -- optional Object, with keys:
|
---|
481 | - `lifetime` -- optional Number, lifetime of the certificate from now in
|
---|
482 | seconds
|
---|
483 | - `validFrom`, `validUntil` -- optional Dates, beginning and end of
|
---|
484 | certificate validity period. If given
|
---|
485 | `lifetime` will be ignored
|
---|
486 | - `serial` -- optional Buffer, the serial number of the certificate
|
---|
487 | - `purposes` -- optional Array of String, X.509 key usage restrictions
|
---|
488 |
|
---|
489 | ### `Certificate#subjects`
|
---|
490 |
|
---|
491 | Array of `Identity` instances describing the subject of this certificate.
|
---|
492 |
|
---|
493 | ### `Certificate#issuer`
|
---|
494 |
|
---|
495 | The `Identity` of the Certificate's issuer (signer).
|
---|
496 |
|
---|
497 | ### `Certificate#subjectKey`
|
---|
498 |
|
---|
499 | The public key of the subject of the certificate, as a `Key` instance.
|
---|
500 |
|
---|
501 | ### `Certificate#issuerKey`
|
---|
502 |
|
---|
503 | The public key of the signing issuer of this certificate, as a `Key` instance.
|
---|
504 | May be `undefined` if the issuer's key is unknown (e.g. on an X509 certificate).
|
---|
505 |
|
---|
506 | ### `Certificate#serial`
|
---|
507 |
|
---|
508 | The serial number of the certificate. As this is normally a 64-bit or wider
|
---|
509 | integer, it is returned as a Buffer.
|
---|
510 |
|
---|
511 | ### `Certificate#purposes`
|
---|
512 |
|
---|
513 | Array of Strings indicating the X.509 key usage purposes that this certificate
|
---|
514 | is valid for. The possible strings at the moment are:
|
---|
515 |
|
---|
516 | * `'signature'` -- key can be used for digital signatures
|
---|
517 | * `'identity'` -- key can be used to attest about the identity of the signer
|
---|
518 | (X.509 calls this `nonRepudiation`)
|
---|
519 | * `'codeSigning'` -- key can be used to sign executable code
|
---|
520 | * `'keyEncryption'` -- key can be used to encrypt other keys
|
---|
521 | * `'encryption'` -- key can be used to encrypt data (only applies for RSA)
|
---|
522 | * `'keyAgreement'` -- key can be used for key exchange protocols such as
|
---|
523 | Diffie-Hellman
|
---|
524 | * `'ca'` -- key can be used to sign other certificates (is a Certificate
|
---|
525 | Authority)
|
---|
526 | * `'crl'` -- key can be used to sign Certificate Revocation Lists (CRLs)
|
---|
527 |
|
---|
528 | ### `Certificate#getExtension(nameOrOid)`
|
---|
529 |
|
---|
530 | Retrieves information about a certificate extension, if present, or returns
|
---|
531 | `undefined` if not. The string argument `nameOrOid` should be either the OID
|
---|
532 | (for X509 extensions) or the name (for OpenSSH extensions) of the extension
|
---|
533 | to retrieve.
|
---|
534 |
|
---|
535 | The object returned will have the following properties:
|
---|
536 |
|
---|
537 | * `format` -- String, set to either `'x509'` or `'openssh'`
|
---|
538 | * `name` or `oid` -- String, only one set based on value of `format`
|
---|
539 | * `data` -- Buffer, the raw data inside the extension
|
---|
540 |
|
---|
541 | ### `Certificate#getExtensions()`
|
---|
542 |
|
---|
543 | Returns an Array of all present certificate extensions, in the same manner and
|
---|
544 | format as `getExtension()`.
|
---|
545 |
|
---|
546 | ### `Certificate#isExpired([when])`
|
---|
547 |
|
---|
548 | Tests whether the Certificate is currently expired (i.e. the `validFrom` and
|
---|
549 | `validUntil` dates specify a range of time that does not include the current
|
---|
550 | time).
|
---|
551 |
|
---|
552 | Parameters
|
---|
553 |
|
---|
554 | - `when` -- optional Date, if specified, tests whether the Certificate was or
|
---|
555 | will be expired at the specified time instead of now
|
---|
556 |
|
---|
557 | Returns a Boolean.
|
---|
558 |
|
---|
559 | ### `Certificate#isSignedByKey(key)`
|
---|
560 |
|
---|
561 | Tests whether the Certificate was validly signed by the given (public) Key.
|
---|
562 |
|
---|
563 | Parameters
|
---|
564 |
|
---|
565 | - `key` -- a Key instance
|
---|
566 |
|
---|
567 | Returns a Boolean.
|
---|
568 |
|
---|
569 | ### `Certificate#isSignedBy(certificate)`
|
---|
570 |
|
---|
571 | Tests whether this Certificate was validly signed by the subject of the given
|
---|
572 | certificate. Also tests that the issuer Identity of this Certificate and the
|
---|
573 | subject Identity of the other Certificate are equivalent.
|
---|
574 |
|
---|
575 | Parameters
|
---|
576 |
|
---|
577 | - `certificate` -- another Certificate instance
|
---|
578 |
|
---|
579 | Returns a Boolean.
|
---|
580 |
|
---|
581 | ### `Certificate#fingerprint([hashAlgo])`
|
---|
582 |
|
---|
583 | Returns the X509-style fingerprint of the entire certificate (as a Fingerprint
|
---|
584 | instance). This matches what a web-browser or similar would display as the
|
---|
585 | certificate fingerprint and should not be confused with the fingerprint of the
|
---|
586 | subject's public key.
|
---|
587 |
|
---|
588 | Parameters
|
---|
589 |
|
---|
590 | - `hashAlgo` -- an optional String, any hash function name
|
---|
591 |
|
---|
592 | ### `Certificate#toBuffer([format])`
|
---|
593 |
|
---|
594 | Serializes the Certificate to a Buffer and returns it.
|
---|
595 |
|
---|
596 | Parameters
|
---|
597 |
|
---|
598 | - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or
|
---|
599 | `'x509'`. Defaults to `'x509'`.
|
---|
600 |
|
---|
601 | Returns a Buffer.
|
---|
602 |
|
---|
603 | ### `Certificate#toString([format])`
|
---|
604 |
|
---|
605 | - `format` -- an optional String, output format, one of `'openssh'`, `'pem'` or
|
---|
606 | `'x509'`. Defaults to `'pem'`.
|
---|
607 |
|
---|
608 | Returns a String.
|
---|
609 |
|
---|
610 | ## Certificate identities
|
---|
611 |
|
---|
612 | ### `identityForHost(hostname)`
|
---|
613 |
|
---|
614 | Constructs a host-type Identity for a given hostname.
|
---|
615 |
|
---|
616 | Parameters
|
---|
617 |
|
---|
618 | - `hostname` -- the fully qualified DNS name of the host
|
---|
619 |
|
---|
620 | Returns an Identity instance.
|
---|
621 |
|
---|
622 | ### `identityForUser(uid)`
|
---|
623 |
|
---|
624 | Constructs a user-type Identity for a given UID.
|
---|
625 |
|
---|
626 | Parameters
|
---|
627 |
|
---|
628 | - `uid` -- a String, user identifier (login name)
|
---|
629 |
|
---|
630 | Returns an Identity instance.
|
---|
631 |
|
---|
632 | ### `identityForEmail(email)`
|
---|
633 |
|
---|
634 | Constructs an email-type Identity for a given email address.
|
---|
635 |
|
---|
636 | Parameters
|
---|
637 |
|
---|
638 | - `email` -- a String, email address
|
---|
639 |
|
---|
640 | Returns an Identity instance.
|
---|
641 |
|
---|
642 | ### `identityFromDN(dn)`
|
---|
643 |
|
---|
644 | Parses an LDAP-style DN string (e.g. `'CN=foo, C=US'`) and turns it into an
|
---|
645 | Identity instance.
|
---|
646 |
|
---|
647 | Parameters
|
---|
648 |
|
---|
649 | - `dn` -- a String
|
---|
650 |
|
---|
651 | Returns an Identity instance.
|
---|
652 |
|
---|
653 | ### `identityFromArray(arr)`
|
---|
654 |
|
---|
655 | Constructs an Identity from an array of DN components (see `Identity#toArray()`
|
---|
656 | for the format).
|
---|
657 |
|
---|
658 | Parameters
|
---|
659 |
|
---|
660 | - `arr` -- an Array of Objects, DN components with `name` and `value`
|
---|
661 |
|
---|
662 | Returns an Identity instance.
|
---|
663 |
|
---|
664 |
|
---|
665 | Supported attributes in DNs:
|
---|
666 |
|
---|
667 | | Attribute name | OID |
|
---|
668 | | -------------- | --- |
|
---|
669 | | `cn` | `2.5.4.3` |
|
---|
670 | | `o` | `2.5.4.10` |
|
---|
671 | | `ou` | `2.5.4.11` |
|
---|
672 | | `l` | `2.5.4.7` |
|
---|
673 | | `s` | `2.5.4.8` |
|
---|
674 | | `c` | `2.5.4.6` |
|
---|
675 | | `sn` | `2.5.4.4` |
|
---|
676 | | `postalCode` | `2.5.4.17` |
|
---|
677 | | `serialNumber` | `2.5.4.5` |
|
---|
678 | | `street` | `2.5.4.9` |
|
---|
679 | | `x500UniqueIdentifier` | `2.5.4.45` |
|
---|
680 | | `role` | `2.5.4.72` |
|
---|
681 | | `telephoneNumber` | `2.5.4.20` |
|
---|
682 | | `description` | `2.5.4.13` |
|
---|
683 | | `dc` | `0.9.2342.19200300.100.1.25` |
|
---|
684 | | `uid` | `0.9.2342.19200300.100.1.1` |
|
---|
685 | | `mail` | `0.9.2342.19200300.100.1.3` |
|
---|
686 | | `title` | `2.5.4.12` |
|
---|
687 | | `gn` | `2.5.4.42` |
|
---|
688 | | `initials` | `2.5.4.43` |
|
---|
689 | | `pseudonym` | `2.5.4.65` |
|
---|
690 |
|
---|
691 | ### `Identity#toString()`
|
---|
692 |
|
---|
693 | Returns the identity as an LDAP-style DN string.
|
---|
694 | e.g. `'CN=foo, O=bar corp, C=us'`
|
---|
695 |
|
---|
696 | ### `Identity#type`
|
---|
697 |
|
---|
698 | The type of identity. One of `'host'`, `'user'`, `'email'` or `'unknown'`
|
---|
699 |
|
---|
700 | ### `Identity#hostname`
|
---|
701 | ### `Identity#uid`
|
---|
702 | ### `Identity#email`
|
---|
703 |
|
---|
704 | Set when `type` is `'host'`, `'user'`, or `'email'`, respectively. Strings.
|
---|
705 |
|
---|
706 | ### `Identity#cn`
|
---|
707 |
|
---|
708 | The value of the first `CN=` in the DN, if any. It's probably better to use
|
---|
709 | the `#get()` method instead of this property.
|
---|
710 |
|
---|
711 | ### `Identity#get(name[, asArray])`
|
---|
712 |
|
---|
713 | Returns the value of a named attribute in the Identity DN. If there is no
|
---|
714 | attribute of the given name, returns `undefined`. If multiple components
|
---|
715 | of the DN contain an attribute of this name, an exception is thrown unless
|
---|
716 | the `asArray` argument is given as `true` -- then they will be returned as
|
---|
717 | an Array in the same order they appear in the DN.
|
---|
718 |
|
---|
719 | Parameters
|
---|
720 |
|
---|
721 | - `name` -- a String
|
---|
722 | - `asArray` -- an optional Boolean
|
---|
723 |
|
---|
724 | ### `Identity#toArray()`
|
---|
725 |
|
---|
726 | Returns the Identity as an Array of DN component objects. This looks like:
|
---|
727 |
|
---|
728 | ```js
|
---|
729 | [ {
|
---|
730 | "name": "cn",
|
---|
731 | "value": "Joe Bloggs"
|
---|
732 | },
|
---|
733 | {
|
---|
734 | "name": "o",
|
---|
735 | "value": "Organisation Ltd"
|
---|
736 | } ]
|
---|
737 | ```
|
---|
738 |
|
---|
739 | Each object has a `name` and a `value` property. The returned objects may be
|
---|
740 | safely modified.
|
---|
741 |
|
---|
742 | Errors
|
---|
743 | ------
|
---|
744 |
|
---|
745 | ### `InvalidAlgorithmError`
|
---|
746 |
|
---|
747 | The specified algorithm is not valid, either because it is not supported, or
|
---|
748 | because it was not included on a list of allowed algorithms.
|
---|
749 |
|
---|
750 | Thrown by `Fingerprint.parse`, `Key#fingerprint`.
|
---|
751 |
|
---|
752 | Properties
|
---|
753 |
|
---|
754 | - `algorithm` -- the algorithm that could not be validated
|
---|
755 |
|
---|
756 | ### `FingerprintFormatError`
|
---|
757 |
|
---|
758 | The fingerprint string given could not be parsed as a supported fingerprint
|
---|
759 | format, or the specified fingerprint format is invalid.
|
---|
760 |
|
---|
761 | Thrown by `Fingerprint.parse`, `Fingerprint#toString`.
|
---|
762 |
|
---|
763 | Properties
|
---|
764 |
|
---|
765 | - `fingerprint` -- if caused by a fingerprint, the string value given
|
---|
766 | - `format` -- if caused by an invalid format specification, the string value given
|
---|
767 |
|
---|
768 | ### `KeyParseError`
|
---|
769 |
|
---|
770 | The key data given could not be parsed as a valid key.
|
---|
771 |
|
---|
772 | Properties
|
---|
773 |
|
---|
774 | - `keyName` -- `filename` that was given to `parseKey`
|
---|
775 | - `format` -- the `format` that was trying to parse the key (see `parseKey`)
|
---|
776 | - `innerErr` -- the inner Error thrown by the format parser
|
---|
777 |
|
---|
778 | ### `KeyEncryptedError`
|
---|
779 |
|
---|
780 | The key is encrypted with a symmetric key (ie, it is password protected). The
|
---|
781 | parsing operation would succeed if it was given the `passphrase` option.
|
---|
782 |
|
---|
783 | Properties
|
---|
784 |
|
---|
785 | - `keyName` -- `filename` that was given to `parseKey`
|
---|
786 | - `format` -- the `format` that was trying to parse the key (currently can only
|
---|
787 | be `"pem"`)
|
---|
788 |
|
---|
789 | ### `CertificateParseError`
|
---|
790 |
|
---|
791 | The certificate data given could not be parsed as a valid certificate.
|
---|
792 |
|
---|
793 | Properties
|
---|
794 |
|
---|
795 | - `certName` -- `filename` that was given to `parseCertificate`
|
---|
796 | - `format` -- the `format` that was trying to parse the key
|
---|
797 | (see `parseCertificate`)
|
---|
798 | - `innerErr` -- the inner Error thrown by the format parser
|
---|
799 |
|
---|
800 | Friends of sshpk
|
---|
801 | ----------------
|
---|
802 |
|
---|
803 | * [`sshpk-agent`](https://github.com/arekinath/node-sshpk-agent) is a library
|
---|
804 | for speaking the `ssh-agent` protocol from node.js, which uses `sshpk`
|
---|