You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

676 lines
20 KiB

5 years ago
5 years ago
  1. .\" Copyright (c) 2019-2020 Rodolphe Bréard <rodolphe@breard.tf>
  2. .\"
  3. .\" Copying and distribution of this file, with or without modification,
  4. .\" are permitted in any medium without royalty provided the copyright
  5. .\" notice and this notice are preserved. This file is offered as-is,
  6. .\" without any warranty.
  7. .Dd June 12, 2020
  8. .Dt ACMED.TOML 5
  9. .Os
  10. .Sh NAME
  11. .Nm acmed.toml
  12. .Nd ACMEd configuration file
  13. .Sh DESCRIPTION
  14. .Nm
  15. is the configuration file for
  16. .Xr acmed 8 .
  17. It is written in the
  18. .Em TOML
  19. format. The allowed elements are described below.
  20. .Bl -tag
  21. .It Ic include
  22. Array containing the path to configuration file to include. The path can be either relative or absolute. If relative, it is relative to the configuration file which included it.
  23. .Pp
  24. In case or overlapping global option definition, the one of the last included file will be used. For example, if a file
  25. .Em A
  26. includes files
  27. .Em B
  28. and
  29. .Em C
  30. and all three defines the same global option, the final value will be the one defined in file
  31. .Em C .
  32. .It Ic global
  33. Table containing the global configuration options.
  34. .Bl -tag
  35. .It Cm accounts_directory Ar string
  36. Specify the directory where the accounts private and public keys are stored.
  37. .It Cm certificates_directory Ar string
  38. Specify the directory where the certificates and their associated private keys are stored.
  39. .It Cm cert_file_mode Ar integer
  40. Specify the permissions to use for newly-created certificates files. See
  41. .Xr chmod 2
  42. for more details.
  43. .It Cm cert_file_user Ar username|user_id Ft string
  44. Specify the user who will own newly-created certificates files. See
  45. .Xr chown 2
  46. for more details.
  47. .It Cm cert_file_group Ar group_name|group_id Ft string
  48. Specify the group who will own newly-created certificates files. See
  49. .Xr chown 2
  50. for more details.
  51. .It Ic env Ar table
  52. Table of environment variables that will be accessible from hooks.
  53. .It Cm pk_file_mode Ar integer
  54. Specify the permissions to use for newly-created private-key files. See
  55. .Xr chmod 2
  56. for more details.
  57. .It Cm pk_file_user Ar username|user_id Ft string
  58. Specify the user who will own newly-created private-key files. See
  59. .Xr chown 2
  60. for more details.
  61. .It Cm pk_file_group Ar group_name|group_id Ft string
  62. Specify the group who will own newly-created private-key files. See
  63. .Xr chown 2
  64. for more details.
  65. .It Cm renew_delay Ar string
  66. Period of time between the certificate renewal and its expiration date. The format is described in the
  67. .Sx TIME PERIODS
  68. section. Default is 3w.
  69. .El
  70. .It Ic rate-limit
  71. Array of table where each element defines a HTTPS rate limit.
  72. .Bl -tag
  73. .It Cm name Ar string
  74. The name the rate limit is registered under. Must be unique.
  75. .It Cm number Ar integer
  76. Number of requests authorized withing the time period.
  77. .It Cm period Ar string
  78. Period of time during which a maximal number of requests is authorized. The format is described in the
  79. .Sx TIME PERIODS
  80. section.
  81. .El
  82. .It Ic endpoint
  83. Array of table where each element defines a Certificate Authority
  84. .Pq CA
  85. which may be used to request certificates.
  86. .Bl -tag
  87. .It Cm name Ar string
  88. The name the endpoint is registered under. Must be unique.
  89. .It Cm rate_limits Ar array
  90. Array containing the names of the HTTPS rate limits to apply.
  91. .It Cm tos_agreed Ar boolean
  92. Set whether or not the user agrees to the Terms Of Service
  93. .Pq TOS .
  94. .It Cm url Ar string
  95. The endpoint's directory URL.
  96. .It Cm key_type Ar string
  97. Name of the asymmetric cryptography algorithm used to generate the client account's key pair. Possible values are :
  98. .Bl -dash -compact
  99. .It
  100. rsa2048
  101. .It
  102. rsa4096
  103. .It
  104. ecdsa_p256
  105. .Aq default
  106. .It
  107. ecdsa_p384
  108. .El
  109. .It Cm signature_algorithm Ar string
  110. Name of the signature algorithm used to sign the messages sent to the endpoint. The default value is derived from the key type. Possible values are:
  111. .Bl -dash -compact
  112. .It
  113. RS256
  114. .It
  115. ES256
  116. .It
  117. ES384
  118. .El
  119. .It Cm renew_delay Ar string
  120. Period of time between the certificate renewal and its expiration date. The format is described in the
  121. .Sx TIME PERIODS
  122. section. Default is the value defined in the global section.
  123. .El
  124. .It Ic hook
  125. Array of table where each element defines a command that will be launched at a defined point. See section
  126. .Sx WRITING A HOOK
  127. for more details.
  128. .Bl -tag
  129. .It Cm allow_failure Ar boolean
  130. Defines if an error return value for this hook is allowed or not. If not allowed, a failure in this hook will fail the whole certificate request process. Default is false.
  131. .It Cm name Ar string
  132. The name the hook is registered under. Must be unique.
  133. .It Cm type Ar array
  134. Array of strings. Possible types are:
  135. .Bl -dash -compact
  136. .It
  137. challenge-http-01
  138. .It
  139. challenge-http-01-clean
  140. .It
  141. challenge-dns-01
  142. .It
  143. challenge-dns-01-clean
  144. .It
  145. challenge-tls-alpn-01
  146. .It
  147. challenge-tls-alpn-01-clean
  148. .It
  149. file-pre-create
  150. .It
  151. file-pre-edit
  152. .It
  153. file-post-create
  154. .It
  155. file-post-edit
  156. .It
  157. post-operation
  158. .El
  159. .It Ic cmd Ar string
  160. The name of the command that will be launched.
  161. .It Ic args Ar array
  162. Array of strings representing the command's arguments.
  163. .It Ic stdin Ar string
  164. Path to the file that will be written into the command's standard intput. Mutually exclusive with
  165. .Em stdin_str .
  166. .It Ic stdin_str Ar string
  167. String that will be written into the command's standard input. Mutually exclusive with
  168. .Em stdin .
  169. .It Ic stdout Ar string
  170. Path to the file where the command's standard output if written.
  171. .It Ic stderr Ar string
  172. Path to the file where the command's standard error output if written.
  173. .El
  174. .It Ic group
  175. Array of table allowing to group several hooks as one. A group is considered as new hook.
  176. .Bl -tag
  177. .It Cm name Ar string
  178. The name the group is registered under. This name is considered as a hook name. Must be unique.
  179. .It Cm hooks Ar array
  180. Array containing the names of the hooks that are grouped. The hooks are guaranteed to be called sequentially in the declaration order.
  181. .El
  182. .It Ic account
  183. Array of table representing an account on one or several CA.
  184. .Bl -tag
  185. .It Ic name Ar string
  186. The name the account is registered under. Must be unique.
  187. .It Ic email Ar string
  188. The email address used to contact the account's holder.
  189. .El
  190. .It Ic certificate
  191. Array of table representing a certificate that will be requested to a CA.
  192. .Pp
  193. Note that certificates are identified by the first domain in the list of domains. That means that if you reorder the domains so that a different domain is at the first position, a new certificate with a new name will be issued.
  194. .Bl -tag
  195. .It Ic account Ar string
  196. Name of the account to use.
  197. .It Ic endpoint Ar string
  198. Name of the endpoint to use.
  199. .It Ic env Ar table
  200. Table of environment variables that will be accessible from hooks.
  201. .It Ic domains Ar array
  202. Array of tables listing the domains that should be included in the certificate along with the challenge to use for each one.
  203. .Bl -tag
  204. .It Ic challenge Ar string
  205. The name of the challenge to use to prove the domain's ownership. Possible values are:
  206. .Bl -dash -compact
  207. .It
  208. http-01
  209. .It
  210. dns-01
  211. .It
  212. tls-alpn-01
  213. .El
  214. .It Ic dns Ar string
  215. The domain name.
  216. .It Ic env Ar table
  217. Table of environment variables that will be accessible from hooks.
  218. .El
  219. .It Ic algorithm Ar string
  220. Name of the asymmetric cryptography algorithm used to generate the certificate's key pair. Possible values are :
  221. .Bl -dash -compact
  222. .It
  223. rsa2048
  224. .Aq default
  225. .It
  226. rsa4096
  227. .It
  228. ecdsa_p256
  229. .It
  230. ecdsa_p384
  231. .El
  232. .It Ic kp_reuse Ar boolean
  233. Set whether or not the private key should be reused when renewing the certificate. Default is false.
  234. .It Ic directory Ar string
  235. Path to the directory where certificates and their associated private keys are stored.
  236. .It Ic hooks Ar array
  237. Names of hooks that will be called when requesting a new certificate. The hooks are guaranteed to be called sequentially in the declaration order.
  238. .It Cm renew_delay Ar string
  239. Period of time between the certificate renewal and its expiration date. The format is described in the
  240. .Sx TIME PERIODS
  241. section. Default is the value defined in the associated endpoint.
  242. .El
  243. .Sh WRITING A HOOK
  244. When requesting a certificate from a CA using ACME, there are three steps that are hard to automatize. The first one is solving challenges in order to prove the ownership of every domains to be included: It requires to interact with the configuration of other services, hence depends on how the infrastructure works. The second one is restarting all the services that use a given certificate, for the same reason. The last one is archiving: Although several default methods can be implemented, sometimes admins wants or are required to do it in a different way.
  245. .Pp
  246. In order to allow full automation of the three above steps without imposing arbitrary restrictions or methods,
  247. .Xr acmed 8
  248. uses hooks. Fundamentally, a hook is a command line template that will be called at a specific time of the process. Such an approach allows admins to use any executable script or program located on the machine to customize the process.
  249. .Pp
  250. For a given certificate, hooks are guaranteed to be called sequentially in the declaration order. It is therefore possible to have a hook that depends on another one. Nevertheless, several certificates may be renewed at the same time. Hence, hooks shall not use globing or any other action that may disrupt hooks called by a different certificate.
  251. .Pp
  252. A hook has a type that will influence both the moment it is called and the available template variables. It is possible to declare several types. In such a case, the hook will be invoked whenever one of its type request it. When called, the hook only have access to template variable for the current type. If a hook uses a template variable that does not exists for the current type it is invoked for, the variable is empty.
  253. .Pp
  254. When writing a hook, the values of
  255. .Em args ,
  256. .Em stdin ,
  257. .Em stdin_str ,
  258. .Em stdout
  259. and
  260. .Em stderr
  261. are considered as template strings whereas
  262. .Em cmd
  263. is not. The template syntax is
  264. .Em Handlebars .
  265. See the
  266. .Sx STANDARDS
  267. section for a link to the
  268. .Em Handlebars
  269. specifications.
  270. .Pp
  271. The available types and the associated template variable are described below.
  272. .Bl -tag
  273. .It Ic challenge-http-01
  274. Invoked when the ownership of a domain must be proved using the
  275. .Em http-01
  276. challenge. The available template variables are:
  277. .Bl -tag -compact
  278. .It Cm challenge Ar string
  279. The name of the challenge type
  280. .Aq http-01 .
  281. Mostly used in hooks with multiple types.
  282. .It Cm domain Ar string
  283. The domain name whom ownership is currently being validated.
  284. .It Cm env Ar array
  285. Array containing all the environment variables.
  286. .It Cm file_name Ar string
  287. Name of the file containing the proof. This is not a full path and does not include the
  288. .Ql .well-known/acme-challenge/
  289. prefix.
  290. .It Cm is_clean_hook Ar bool
  291. False
  292. .It Cm proof Ar string
  293. The content of the proof that must be written to
  294. .Em file_name .
  295. .El
  296. .It Ic challenge-http-01-clean
  297. Invoked once a domain ownership has been proven using the
  298. .Em http-01
  299. challenge. This hook is intended to remove the proof since it is no longer required. The template variables are strictly identical to those given in the corresponding
  300. .Em challenge-http-01
  301. hook, excepted
  302. .Em is_clean_hook
  303. which is set to
  304. .Em true .
  305. .It Ic challenge-dns-01
  306. Invoked when the ownership of a domain must be proved using the
  307. .Em dns-01
  308. challenge. The available template variables are:
  309. .Bl -tag -compact
  310. .It Cm challenge Ar string
  311. The name of the challenge type
  312. .Aq dns-01 .
  313. Mostly used in hooks with multiple types.
  314. .It Cm domain Ar string
  315. The domain name whom ownership is currently being validated.
  316. .It Cm env Ar array
  317. Array containing all the environment variables.
  318. .It Cm is_clean_hook Ar bool
  319. False
  320. .It Cm proof Ar string
  321. The content of the proof that must be written to a
  322. .Ql TXT
  323. entry of the DNS zone for the
  324. .Ql _acme-challenge
  325. subdomain.
  326. .El
  327. .It Ic challenge-dns-01-clean
  328. Invoked once a domain ownership has been proven using the
  329. .Em dns-01
  330. challenge. This hook is intended to remove the proof since it is no longer required. The template variables are strictly identical to those given in the corresponding
  331. .Em challenge-dns-01
  332. hook, excepted
  333. .Em is_clean_hook
  334. which is set to
  335. .Em true .
  336. .It Ic challenge-tls-alpn-01
  337. Invoked when the ownership of a domain must be proved using the
  338. .Em tls-alpn-01
  339. challenge. The available template variables are:
  340. .Bl -tag -compact
  341. .It Cm challenge Ar string
  342. The name of the challenge type
  343. .Aq tls-alpn-01 .
  344. Mostly used in hooks with multiple types.
  345. .It Cm domain Ar string
  346. The domain name whom ownership is currently being validated.
  347. .It Cm env Ar array
  348. Array containing all the environment variables.
  349. .It Cm is_clean_hook Ar bool
  350. False
  351. .It Cm proof Ar string
  352. Plain-text representation of the
  353. .Em acmeIdentifier
  354. extension that should be used in the self-signed certificate presented when a TLS connection is initiated with the
  355. .Qd acme-tls/1
  356. ALPN extension value.
  357. .Xr acmed 8
  358. will not generate the certificate itself since it can be done using
  359. .Xr tacd 8 .
  360. .El
  361. .It Ic challenge-tls-alpn-01-clean
  362. Invoked once a domain ownership has been proven using the
  363. .Em tls-alpn-01
  364. challenge. This hook is intended to remove the proof since it is no longer required. The template variables are strictly identical to those given in the corresponding
  365. .Em challenge-tls-alpn-01
  366. hook, excepted
  367. .Em is_clean_hook
  368. which is set to
  369. .Em true .
  370. .It Ic file-pre-create
  371. Invoked
  372. .Em before
  373. a non-existent file
  374. .Em created .
  375. The available template variables are:
  376. .Bl -tag -compact
  377. .It Cm env Ar array
  378. Array containing all the environment variables.
  379. .It Cm file_directory Ar string
  380. Name of the directory where the impacted file is located.
  381. .It Cm file_name Ar string
  382. Name of the impacted file.
  383. .It Cm file_path Ar string
  384. Full path to the impacted file.
  385. .El
  386. .It Ic file-pre-edit
  387. Invoked
  388. .Em before
  389. an existent file
  390. .Em modified .
  391. The available template variables are the same as those available for the
  392. .Em file-pre-create
  393. type.
  394. .It Ic file-post-create
  395. Invoked
  396. .Em after
  397. a non-existent file
  398. .Em created .
  399. The available template variables are the same as those available for the
  400. .Em file-pre-create
  401. type.
  402. .It Ic file-post-edit
  403. Invoked
  404. .Em after
  405. an existent file
  406. .Em modified .
  407. The available template variables are the same as those available for the
  408. .Em file-pre-create
  409. type.
  410. .It Ic post-operation
  411. Invoked at the end of the certificate request process. The available template variables are:
  412. .Bl -tag -compact
  413. .It Cm algorithm Ar string
  414. Name of the algorithm used in the certificate.
  415. .It Cm domains Ar string
  416. Array containing the domain names included in the requested certificate.
  417. .It Cm env Ar array
  418. Array containing all the environment variables.
  419. .It Cm is_success Ar boolean
  420. True if the certificate request is successful.
  421. .It Cm status Ar string
  422. Human-readable status. If the certificate request failed, it contains the error description.
  423. .El
  424. .El
  425. .Sh DEFAULT HOOKS
  426. Because many people have the same needs, ACMEd comes with a set of hooks that should serve most situations. Hook names being unique, the following names and any other name starting by those is reserved and should not be used.
  427. .Bl -tag
  428. .It Pa git
  429. This hook uses
  430. .Xr git 1
  431. to archive private keys, public keys and certificates. It is possible to customize the commit username and email by using respectively the
  432. .Ev GIT_USERNAME
  433. and
  434. .Ev GIT_EMAIL
  435. environment variables.
  436. .It Pa http-01-echo
  437. This hook is designed to solve the http-01 challenge. For this purpose, it will write the proof into
  438. .Pa {{env.HTTP_ROOT}}/{{domain}}/.well-known/acme-challenge/{{file_name}} .
  439. .Pp
  440. The web server must be configured so the file
  441. .Pa http://{{domain}}/.well-known/acme-challenge/{{file_name}}
  442. can be accessed from the CA.
  443. .Pp
  444. If
  445. .Ev HTTP_ROOT
  446. is not specified, it will be set to
  447. .Pa /var/www .
  448. .It Pa tls-alpn-01-tacd-tcp
  449. This hook is designed to solve the tls-alpn-01 challenge using
  450. .Xr tacd 8 .
  451. It requires
  452. .Xr pkill 1
  453. to support the
  454. .Em Ar -F
  455. option.
  456. .Pp
  457. .Xr tacd 8
  458. will listen on the host defined by the
  459. .Ev TACD_HOST
  460. environment variable (default is the domain to be validated) and on the port defined by the
  461. .Ev TACD_PORT
  462. environment variable (default is 5001).
  463. .Pp
  464. .Xr tacd 8
  465. will store its pid into
  466. .Pa {{TACD_PID_ROOT}}/tacd_{{domain}}.pid .
  467. If
  468. .Ev TACD_PID_ROOT
  469. is not specified, it will be set to
  470. .Pa /run .
  471. .It Pa tls-alpn-01-tacd-unix
  472. This hook is designed to solve the tls-alpn-01 challenge using
  473. .Xr tacd 8 .
  474. It requires
  475. .Xr pkill 1
  476. to support the
  477. .Em Ar -F
  478. option.
  479. .Pp
  480. .Xr tacd 8
  481. will listen on the unix socket
  482. .Pa {{env.TACD_SOCK_ROOT}}/tacd_{{domain}}.sock .
  483. If
  484. .Ev TACD_SOCK_ROOT
  485. is not specified, it will be set to
  486. .Pa /run .
  487. .Pp
  488. .Xr tacd 8
  489. will store its pid into
  490. .Pa {{TACD_PID_ROOT}}/tacd_{{domain}}.pid .
  491. If
  492. .Ev TACD_PID_ROOT
  493. is not specified, it will be set to
  494. .Pa /run .
  495. .El
  496. .Sh TIME PERIODS
  497. ACMEd uses its own time period format, which is vaguely inspired by the ISO 8601 one. Periods are formatted as
  498. .Ar PM[PM...]
  499. where
  500. .Ar M
  501. is case sensitive character representing a length and
  502. .Ar P
  503. is an integer representing a multiplayer for the following length. The authorized length are:
  504. .Bl -dash -compact
  505. .It
  506. .Ar s :
  507. second
  508. .It
  509. .Ar m :
  510. minute
  511. .It
  512. .Ar h :
  513. hour
  514. .It
  515. .Ar d :
  516. day
  517. .It
  518. .Ar w :
  519. week
  520. .El
  521. The
  522. .Ar PM
  523. couples can be specified multiple times and in any order.
  524. .Pp
  525. For example,
  526. .Dq 1d42s and
  527. .Dq 40s20h4h2s
  528. both represents a period of one day and forty-two seconds.
  529. .Sh FILES
  530. .Bl -tag
  531. .It Pa /etc/acmed/acmed.toml
  532. Default
  533. .Xr acmed 8
  534. configuration file.
  535. .It Pa /etc/acmed/accounts
  536. Default accounts private and public keys directory.
  537. .It Pa /etc/acmed/certs
  538. Default certificates and associated private keys directory.
  539. .Sh EXAMPLES
  540. The following example defines a typical endpoint, account and certificate for a domain and several subdomains.
  541. .Bd -literal -offset indent
  542. [[endpoint]]
  543. name = "example name"
  544. url = "https://acme.example.org/directory"
  545. tos_agreed = true
  546. [[account]]
  547. name = "my test account"
  548. email = "certs@exemple.net"
  549. [[certificate]]
  550. endpoint = "example name"
  551. account = "my test account"
  552. domains = [
  553. { dns = "exemple.net", challenge = "http-01"},
  554. { dns = "1.exemple.net", challenge = "dns-01"},
  555. { dns = "2.exemple.net", challenge = "tls-alpn-01", env.TACD_PORT="5010"},
  556. { dns = "3.exemple.net", challenge = "tls-alpn-01", env.TACD_PORT="5011"},
  557. ]
  558. hooks = ["git", "http-01-echo", "tls-alpn-01-tacd-tcp", "some-dns-01-hook"]
  559. env.HTTP_ROOT = "/srv/http"
  560. .Ed
  561. .Pp
  562. It is possible to use
  563. .Xr echo 1
  564. to solve the
  565. .Em http-01
  566. challenge and
  567. .Xr rm 1
  568. to clean it.
  569. .Xr mkdir 1
  570. and
  571. .Xr chmod 1
  572. are used to prevent issues related to file access.
  573. .Bd -literal -offset indent
  574. [[hook]]
  575. name = "http-01-echo-mkdir"
  576. type = ["challenge-http-01"]
  577. cmd = "mkdir"
  578. args = [
  579. "-m", "0755",
  580. "-p", "{{%if env.HTTP_ROOT}}{{env.HTTP_ROOT}}{{else}}/var/www{{/if}}/{{domain}}/.well-known/acme-challenge"
  581. ]
  582. [[hook]]
  583. name = "http-01-echo-echo"
  584. type = ["challenge-http-01"]
  585. cmd = "echo"
  586. args = ["{{proof}}"]
  587. stdout = "{{%if env.HTTP_ROOT}}{{env.HTTP_ROOT}}{{else}}/var/www{{/if}}/{{domain}}/.well-known/acme-challenge/{{file_name}}"
  588. [[hook]]
  589. name = "http-01-echo-chmod"
  590. type = ["challenge-http-01-clean"]
  591. cmd = "chmod"
  592. args = [
  593. "a+r",
  594. "{{%if env.HTTP_ROOT}}{{env.HTTP_ROOT}}{{else}}/var/www{{/if}}/{{domain}}/.well-known/acme-challenge/{{file_name}}"
  595. ]
  596. [[hook]]
  597. name = "http-01-echo-clean"
  598. type = ["challenge-http-01-clean"]
  599. cmd = "rm"
  600. args = [
  601. "-f",
  602. "{{%if env.HTTP_ROOT}}{{env.HTTP_ROOT}}{{else}}/var/www{{/if}}/{{domain}}/.well-known/acme-challenge/{{file_name}}"
  603. ]
  604. .Ed
  605. .Pp
  606. The hooks from the previous example can be grouped in order to reduce the number of hooks to define in the certificate.
  607. .Bd -literal -offset indent
  608. [[group]]
  609. name = "http-01-echo-var-www"
  610. hooks = [
  611. "http-01-echo-mkdir",
  612. "http-01-echo-echo",
  613. "http-01-echo-chmod",
  614. "http-01-echo-clean"
  615. ]
  616. [[certificate]]
  617. # Some fields omitted
  618. hooks = ["http-01-echo"]
  619. env.HTTP_ROOT = "/srv/http"
  620. .Ed
  621. .Pp
  622. It is also possible to use
  623. .Xr sendmail 8
  624. in a hook in order to notif someone when the certificate request process is done.
  625. .Bd -literal -offset indent
  626. [[hook]]
  627. name = "email-report"
  628. type = ["post-operation"]
  629. cmd = "sendmail"
  630. args = [
  631. "-f", "noreply.certs@example.net",
  632. "contact@example.net"
  633. ]
  634. stdin_str = """Subject: Certificate renewal {{#if is_success}}succeeded{{else}}failed{{/if}} for {{domains.[0]}}
  635. The following certificate has {{#unless is_success}}*not* {{/unless}}been renewed.
  636. domains: {{#each domains}}{{#if @index}}, {{/if}}{{this}}{{/each}}
  637. algorithm: {{algorithm}}
  638. status: {{status}}"""
  639. .Ed
  640. .Sh SEE ALSO
  641. .Xr acmed 8 ,
  642. .Xr tacd 8
  643. .Sh STANDARDS
  644. .Bl
  645. .It
  646. .Rs
  647. .%A Tom Preston-Werner
  648. .%D July 2018
  649. .%T TOML v0.5.0
  650. .%U https://github.com/toml-lang/toml
  651. .Re
  652. .It
  653. .Rs
  654. .%A Yehuda Katz
  655. .%T Handlebars
  656. .%U https://handlebarsjs.com/
  657. .Re
  658. .It
  659. .Rs
  660. .%A M. Jones
  661. .%D May 2015
  662. .%R RFC 7518
  663. .%T JSON Web Algorithms (JWA)
  664. .Re
  665. .El
  666. .Sh AUTHORS
  667. .An Rodolphe Bréard
  668. .Aq rodolphe@breard.tf