Add framework for managing letsencrypt certificates
[chef.git] / cookbooks / letsencrypt / recipes / default.rb
1 #
2 # Cookbook Name:: letsencrypt
3 # Recipe:: default
4 #
5 # Copyright 2017, OpenStreetMap Foundation
6 #
7 # Licensed under the Apache License, Version 2.0 (the "License");
8 # you may not use this file except in compliance with the License.
9 # You may obtain a copy of the License at
10 #
11 #     http://www.apache.org/licenses/LICENSE-2.0
12 #
13 # Unless required by applicable law or agreed to in writing, software
14 # distributed under the License is distributed on an "AS IS" BASIS,
15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 # See the License for the specific language governing permissions and
17 # limitations under the License.
18 #
19
20 include_recipe "apache::ssl"
21
22 keys = data_bag_item("chef", "keys")
23
24 package "certbot"
25 package "ruby"
26
27 directory "/etc/letsencrypt" do
28   owner "letsencrypt"
29   group "letsencrypt"
30   mode 0o755
31 end
32
33 directory "/var/lib/letsencrypt" do
34   owner "letsencrypt"
35   group "letsencrypt"
36   mode 0o755
37 end
38
39 directory "/var/log/letsencrypt" do
40   owner "letsencrypt"
41   group "letsencrypt"
42   mode 0o700
43 end
44
45 directory "/srv/acme.openstreetmap.org" do
46   owner "letsencrypt"
47   group "letsencrypt"
48   mode 0o755
49 end
50
51 directory "/srv/acme.openstreetmap.org/html" do
52   owner "letsencrypt"
53   group "letsencrypt"
54   mode 0o755
55 end
56
57 ssl_certificate "acme.openstreetmap.org" do
58   domains ["acme.openstreetmap.org", "acme.osm.org"]
59   notifies :reload, "service[apache2]"
60 end
61
62 apache_site "acme.openstreetmap.org" do
63   template "apache.erb"
64   directory "/srv/acme.openstreetmap.org"
65 end
66
67 directory "/srv/acme.openstreetmap.org/config" do
68   owner "letsencrypt"
69   group "letsencrypt"
70   mode 0o755
71 end
72
73 directory "/srv/acme.openstreetmap.org/work" do
74   owner "letsencrypt"
75   group "letsencrypt"
76   mode 0o755
77 end
78
79 directory "/srv/acme.openstreetmap.org/logs" do
80   owner "letsencrypt"
81   group "letsencrypt"
82   mode 0o700
83 end
84
85 directory "/srv/acme.openstreetmap.org/.chef" do
86   owner "letsencrypt"
87   group "letsencrypt"
88   mode 0o2775
89 end
90
91 file "/srv/acme.openstreetmap.org/.chef/client.pem" do
92   content keys["letsencrypt"].join("\n")
93   owner "letsencrypt"
94   group "letsencrypt"
95   mode 0o660
96 end
97
98 cookbook_file "/srv/acme.openstreetmap.org/.chef/knife.rb" do
99   source "knife.rb"
100   owner "letsencrypt"
101   group "letsencrypt"
102   mode 0o660
103 end
104
105 remote_directory "/srv/acme.openstreetmap.org/bin" do
106   source "bin"
107   owner "root"
108   group "root"
109   mode 0o755
110   files_owner "root"
111   files_group "root"
112   files_mode 0o755
113 end
114
115 directory "/srv/acme.openstreetmap.org/requests" do
116   owner "root"
117   group "root"
118   mode 0o755
119 end
120
121 certificates = search(:node, "letsencrypt:certificates").each_with_object({}) do |n, c|
122   c.merge!(n[:letsencrypt][:certificates])
123 end
124
125 certificates.each do |name, details|
126   template "/srv/acme.openstreetmap.org/requests/#{name}" do
127     source "request.erb"
128     owner "root"
129     group "letsencrypt"
130     mode 0o754
131     variables details
132   end
133
134   execute "/srv/acme.openstreetmap.org/requests/#{name}" do
135     action :nothing
136     command "/srv/acme.openstreetmap.org/requests/#{name}"
137     cwd "/srv/acme.openstreetmap.org"
138     user "letsencrypt"
139     group "letsencrypt"
140     subscribes :run, "template[/srv/acme.openstreetmap.org/requests/#{name}]"
141   end
142 end
143
144 template "/etc/cron.d/letsencrypt" do
145   source "cron.erb"
146   owner "root"
147   group "root"
148   mode 0o644
149 end