
Here is one workflow that might get you where you want to go:
Set the 3D cursor to world origin Shift+s, 1
Create a "unit cone" with radius 1 and depth 1:

Notice Location Z is set to -0.5. This places the vertex of the cone on the origin.
Use the object menu to set the object origin to 3D cursor. Now the cone's origin is at the vertex. All scaling and rotating we will do is reference to the vertex.
Add in a UV Sphere, leave the radius at 1 for simplicity, then move it away from the cone. While you've still got the Sphere selected, add a "Limit Distance" object constraint, set the Target to the Cone, Distance to 1.1 (a little more than the Sphere radius) and "Clamp Region" to outside. This prevents the Sphere from moving too close to the Cone's Vertex. Its hard to calculate the tangent of a point inside the Sphere!

Now we need to point the Cone at the Sphere, to do that select the Cone, and press r, y, -90 to rotate it 90 degrees on the y axis. Then apply rotation. The add a "Track to" object constraint to the Cone. Set the Target to the Sphere, and Axis to x. The Cone's base should now point to the Sphere as you move the Sphere around the scene, and you should not be able to move the Sphere too close to the Cone.

Now we need to add some Drivers to the Cone: Open the Cone's Transform panel, right click on Scale X and choose "Add Driver", on the Driven Property panel, set the "Expression" to var, and under Input Variable set the type to "Distance" and the Targets to Sphere and Cone. This should make the Cone stretch to always intersect the origin of the Sphere. You can experiment with the expression to get the effect you want.

Finally, add drivers to the Cone's Scale:Y and Scale:Z properties.
The expression is
tan(asin(1/dist)) * var
Where dist is a distance variable as setup previously, and var is height of the cone, taken from "Scale:X"
