diff --git a/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java b/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java
index f8c8e418..faf66a41 100644
--- a/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java
+++ b/acme4j-client/src/main/java/org/shredzone/acme4j/Order.java
@@ -45,6 +45,7 @@ public class Order extends AcmeJsonResource {
*
* Possible values are: {@link Status#PENDING}, {@link Status#READY},
* {@link Status#PROCESSING}, {@link Status#VALID}, {@link Status#INVALID}.
+ * If the server supports STAR, another possible value is {@link Status#CANCELED}.
*/
public Status getStatus() {
return getJSON().get("status").asStatus();
@@ -132,11 +133,17 @@ public class Order extends AcmeJsonResource {
* Gets the STAR extension's {@link Certificate} if it is available.
*
* @since 2.6
+ * @throws IllegalStateException
+ * if the order is not ready yet. You must finalize the order first, and wait
+ * for the status to become {@link Status#VALID}. It is also thrown if the
+ * order has been {@link Status#CANCELED}.
*/
- public Optional getAutoRenewalCertificate() {
+ public Certificate getAutoRenewalCertificate() {
return getJSON().get("star-certificate")
- .map(Value::asURL)
- .map(getLogin()::bindCertificate);
+ .optional()
+ .map(Value::asURL)
+ .map(getLogin()::bindCertificate)
+ .orElseThrow(() -> new IllegalStateException("Order is in an invalid state"));
}
/**
diff --git a/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java b/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java
index 918c71f8..76d8e488 100644
--- a/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java
+++ b/acme4j-client/src/test/java/org/shredzone/acme4j/OrderTest.java
@@ -218,7 +218,8 @@ public class OrderTest {
.isEqualTo("2016-01-08T00:00:00Z");
softly.assertThat(order.getCertificate().getLocation())
.isEqualTo(url("https://example.com/acme/cert/1234"));
- softly.assertThat(order.getAutoRenewalCertificate()).isEmpty();
+ softly.assertThatIllegalStateException()
+ .isThrownBy(order::getAutoRenewalCertificate);
softly.assertThat(order.getFinalizeLocation()).isEqualTo(finalizeUrl);
var auths = order.getAuthorizations();
@@ -310,7 +311,7 @@ public class OrderTest {
try (var softly = new AutoCloseableSoftAssertions()) {
softly.assertThatIllegalStateException()
.isThrownBy(order::getCertificate);
- softly.assertThat(order.getAutoRenewalCertificate().orElseThrow().getLocation())
+ softly.assertThat(order.getAutoRenewalCertificate().getLocation())
.isEqualTo(url("https://example.com/acme/cert/1234"));
softly.assertThat(order.isAutoRenewing()).isTrue();
softly.assertThat(order.getAutoRenewalStartDate().orElseThrow())