diff --git a/zbus/src/handshake.rs b/zbus/src/handshake.rs
index 35fa9717696e0cd5f5bc838da477c35801491246..a9a13baa987bcde7956aed67372676058042289d 100644
--- a/zbus/src/handshake.rs
+++ b/zbus/src/handshake.rs
@@ -417,6 +417,28 @@ impl<S: Socket> Handshake<S> for ClientHandshake<S> {
             } else {
                 cmd.into()
             };
+            // The dbus daemon on these platforms currently requires sending the zero byte
+            // as a separate message with SCM_CREDS
+            #[cfg(any(target_os = "freebsd", target_os = "dragonfly"))]
+            if self.step == Init {
+                use nix::sys::socket::{sendmsg, ControlMessage, MsgFlags};
+
+                let zero = &[self.send_buffer.drain(..1).next().unwrap()];
+                let iov = [nix::sys::uio::IoVec::from_slice(zero)];
+
+                if sendmsg(
+                    self.socket.as_raw_fd(),
+                    &iov,
+                    &[ControlMessage::ScmCreds],
+                    MsgFlags::empty(),
+                    None,
+                ) != Ok(1)
+                {
+                    return Err(Error::Handshake(
+                        "Could not send zero byte with credentials".to_string(),
+                    ));
+                }
+            }
             self.step = next_step;
         }
     }