I like to use the following method:
Add a hidden and required text field with the following defaut value: "Off".
As its custom calculation script enter this code (adjust the name of the check-box field, of course):
event.value = this.getField("CheckBox1").value;
This will now cause the text box to always have the same value as the check-box, and if the latter is empty the former will not pass the validation... It's a bit of a hack, but it works.