|
40 | 40 |
|
41 | 41 | import pytest |
42 | 42 | from freezegun import freeze_time |
| 43 | +from freezegun.api import FrozenDateTimeFactory |
43 | 44 | from pytest_django.fixtures import SettingsWrapper |
44 | 45 |
|
45 | 46 | from django_ca.conf import model_settings |
|
50 | 51 | from django_ca.tests.base.assertions import ( |
51 | 52 | assert_certificate, |
52 | 53 | assert_crl, |
| 54 | + assert_crls, |
53 | 55 | assert_removed_in_310, |
54 | 56 | assert_sign_cert_signals, |
55 | 57 | ) |
@@ -124,112 +126,48 @@ def test_root(root: CertificateAuthority, child: CertificateAuthority) -> None: |
124 | 126 | @pytest.mark.freeze_time(TIMESTAMPS["everything_valid"]) |
125 | 127 | def test_generate_crls(settings: SettingsWrapper, usable_ca: CertificateAuthority) -> None: |
126 | 128 | """Test generation of CRLs.""" |
127 | | - ca_private_key_options = StoragesUsePrivateKeyOptions(password=CERT_DATA[usable_ca.name].get("password")) |
128 | | - der_user_key = crl_cache_key(usable_ca.serial, only_contains_user_certs=True) |
129 | | - pem_user_key = crl_cache_key(usable_ca.serial, Encoding.PEM, only_contains_user_certs=True) |
130 | | - der_ca_key = crl_cache_key(usable_ca.serial, only_contains_ca_certs=True) |
131 | | - pem_ca_key = crl_cache_key(usable_ca.serial, Encoding.PEM, only_contains_ca_certs=True) |
132 | | - user_idp = get_idp(full_name=None, only_contains_user_certs=True) |
133 | | - ca_idp = get_idp(full_name=None, only_contains_ca_certs=True) |
| 129 | + key_backend_options = StoragesUsePrivateKeyOptions(password=CERT_DATA[usable_ca.name].get("password")) |
134 | 130 |
|
135 | | - assert cache.get(der_ca_key) is None |
136 | | - assert cache.get(pem_ca_key) is None |
137 | | - assert cache.get(der_user_key) is None |
138 | | - assert cache.get(pem_user_key) is None |
| 131 | + usable_ca.generate_crls(key_backend_options) |
| 132 | + assert_crls(usable_ca) |
139 | 133 |
|
140 | | - usable_ca.generate_crls(ca_private_key_options) |
141 | 134 |
|
142 | | - der_user_crl = cache.get(der_user_key) |
143 | | - pem_user_crl = cache.get(pem_user_key) |
144 | | - assert_crl( |
145 | | - der_user_crl, |
146 | | - idp=user_idp, |
147 | | - encoding=Encoding.DER, |
148 | | - signer=usable_ca, |
149 | | - algorithm=usable_ca.algorithm, |
150 | | - ) |
151 | | - assert_crl( |
152 | | - pem_user_crl, |
153 | | - idp=user_idp, |
154 | | - encoding=Encoding.PEM, |
155 | | - signer=usable_ca, |
156 | | - algorithm=usable_ca.algorithm, |
157 | | - ) |
| 135 | +@pytest.mark.usefixtures("clear_cache") |
| 136 | +@pytest.mark.freeze_time |
| 137 | +def test_generate_crls_with_regeneration( |
| 138 | + settings: SettingsWrapper, freezer: FrozenDateTimeFactory, usable_root: CertificateAuthority |
| 139 | +) -> None: |
| 140 | + """Test generation of CRLs.""" |
| 141 | + print(TIMESTAMPS["everything_valid"]) |
| 142 | + key_backend_options = StoragesUsePrivateKeyOptions() |
158 | 143 |
|
159 | | - der_ca_crl = cache.get(der_ca_key) |
160 | | - pem_ca_crl = cache.get(pem_ca_key) |
161 | | - assert_crl( |
162 | | - der_ca_crl, |
163 | | - idp=ca_idp, |
164 | | - encoding=Encoding.DER, |
165 | | - signer=usable_ca, |
166 | | - algorithm=usable_ca.algorithm, |
167 | | - ) |
168 | | - assert_crl( |
169 | | - pem_ca_crl, |
170 | | - idp=ca_idp, |
171 | | - encoding=Encoding.PEM, |
172 | | - signer=usable_ca, |
173 | | - algorithm=usable_ca.algorithm, |
174 | | - ) |
| 144 | + # Generate CRLs and test contents (just to be sure) |
| 145 | + usable_root.generate_crls(key_backend_options) |
| 146 | + assert_crls(usable_root) |
175 | 147 |
|
176 | | - # cache again - which will force triggering a new computation |
177 | | - usable_ca.generate_crls(ca_private_key_options) |
178 | | - |
179 | | - # Get CRLs from cache - we have a new CRLNumber |
180 | | - der_user_crl = cache.get(der_user_key) |
181 | | - pem_user_crl = cache.get(pem_user_key) |
182 | | - assert_crl( |
183 | | - der_user_crl, |
184 | | - idp=user_idp, |
185 | | - crl_number=1, |
186 | | - encoding=Encoding.DER, |
187 | | - signer=usable_ca, |
188 | | - algorithm=usable_ca.algorithm, |
189 | | - ) |
190 | | - assert_crl( |
191 | | - pem_user_crl, |
192 | | - idp=user_idp, |
193 | | - crl_number=1, |
194 | | - encoding=Encoding.PEM, |
195 | | - signer=usable_ca, |
196 | | - algorithm=usable_ca.algorithm, |
197 | | - ) |
| 148 | + # Generate again - should not do anything, b/c values are cached |
| 149 | + usable_root.generate_crls(key_backend_options) |
| 150 | + assert_crls(usable_root) |
198 | 151 |
|
199 | | - der_ca_crl = cache.get(der_ca_key) |
200 | | - pem_ca_crl = cache.get(pem_ca_key) |
201 | | - assert_crl( |
202 | | - der_ca_crl, |
203 | | - idp=ca_idp, |
204 | | - crl_number=1, |
205 | | - encoding=Encoding.DER, |
206 | | - signer=usable_ca, |
207 | | - algorithm=usable_ca.algorithm, |
208 | | - ) |
209 | | - assert_crl( |
210 | | - pem_ca_crl, |
211 | | - idp=ca_idp, |
212 | | - crl_number=1, |
213 | | - encoding=Encoding.PEM, |
214 | | - signer=usable_ca, |
215 | | - algorithm=usable_ca.algorithm, |
216 | | - ) |
| 152 | + # move time ahead so that we regenerate |
| 153 | + freezer.tick(timedelta(hours=12)) |
217 | 154 |
|
218 | | - # clear caches and skip generation |
219 | | - cache.clear() |
220 | | - crl_profiles = { |
221 | | - k: v.model_dump(exclude={"encodings", "scope"}) for k, v in model_settings.CA_CRL_PROFILES.items() |
222 | | - } |
223 | | - crl_profiles["ca"]["OVERRIDES"][usable_ca.serial] = {"skip": True} |
224 | | - crl_profiles["user"]["OVERRIDES"][usable_ca.serial] = {"skip": True} |
| 155 | + # generate again - values should be cached and no new CRLs are created |
| 156 | + usable_root.generate_crls(key_backend_options) |
| 157 | + assert_crls(usable_root, number=1) |
225 | 158 |
|
226 | | - settings.CA_CRL_PROFILES = crl_profiles |
227 | | - usable_ca.generate_crls(ca_private_key_options) |
228 | 159 |
|
229 | | - assert cache.get(der_ca_key) is None |
230 | | - assert cache.get(pem_ca_key) is None |
231 | | - assert cache.get(der_user_key) is None |
232 | | - assert cache.get(pem_user_key) is None |
| 160 | +@pytest.mark.usefixtures("clear_cache") |
| 161 | +@pytest.mark.freeze_time(TIMESTAMPS["everything_valid"]) |
| 162 | +def test_generate_crls_with_force(settings: SettingsWrapper, usable_root: CertificateAuthority) -> None: |
| 163 | + """Test the force option.""" |
| 164 | + # Initially generate CRLs |
| 165 | + usable_root.generate_crls(KEY_BACKEND_OPTIONS) |
| 166 | + assert_crls(usable_root) |
| 167 | + |
| 168 | + # Generate CRLs again, forcing regeneration |
| 169 | + usable_root.generate_crls(KEY_BACKEND_OPTIONS, force=True) |
| 170 | + assert_crls(usable_root, number=1) |
233 | 171 |
|
234 | 172 |
|
235 | 173 | @pytest.mark.usefixtures("clear_cache") |
@@ -280,6 +218,29 @@ def test_generate_crls_with_overrides(settings: SettingsWrapper, usable_root: Ce |
280 | 218 | assert pem_user_crl.next_update_utc == TIMESTAMPS["everything_valid"] + timedelta(days=3) |
281 | 219 |
|
282 | 220 |
|
| 221 | +@pytest.mark.usefixtures("clear_cache") |
| 222 | +@pytest.mark.freeze_time(TIMESTAMPS["everything_valid"]) |
| 223 | +def test_generate_crls_with_skip(settings: SettingsWrapper, usable_root: CertificateAuthority) -> None: |
| 224 | + """Test the skip option in CRL profiles.""" |
| 225 | + crl_profiles = { |
| 226 | + k: v.model_dump(exclude={"encodings", "scope"}) for k, v in model_settings.CA_CRL_PROFILES.items() |
| 227 | + } |
| 228 | + crl_profiles["ca"]["OVERRIDES"][usable_root.serial] = {"skip": True} |
| 229 | + crl_profiles["user"]["OVERRIDES"][usable_root.serial] = {"skip": True} |
| 230 | + |
| 231 | + settings.CA_CRL_PROFILES = crl_profiles |
| 232 | + usable_root.generate_crls(StoragesUsePrivateKeyOptions()) |
| 233 | + |
| 234 | + der_user_key = crl_cache_key(usable_root.serial, only_contains_user_certs=True) |
| 235 | + pem_user_key = crl_cache_key(usable_root.serial, Encoding.PEM, only_contains_user_certs=True) |
| 236 | + der_ca_key = crl_cache_key(usable_root.serial, only_contains_ca_certs=True) |
| 237 | + pem_ca_key = crl_cache_key(usable_root.serial, Encoding.PEM, only_contains_ca_certs=True) |
| 238 | + assert cache.get(der_ca_key) is None |
| 239 | + assert cache.get(pem_ca_key) is None |
| 240 | + assert cache.get(der_user_key) is None |
| 241 | + assert cache.get(pem_user_key) is None |
| 242 | + |
| 243 | + |
283 | 244 | @pytest.mark.usefixtures("clear_cache") |
284 | 245 | @pytest.mark.freeze_time(TIMESTAMPS["everything_valid"]) |
285 | 246 | def test_deprecated_cache_crls(usable_root: CertificateAuthority) -> None: |
|
0 commit comments